<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          解剖幾個有點難度的C筆試題

          共 5756字,需瀏覽 12分鐘

           ·

          2021-05-20 12:39

          總結了幾個比較經(jīng)典的筆試題目,這些題目是在面試中遇到的,有難度,但是不是那種特別難的,比較有代表性,如果正在找工作的話,可以看看,豐富一下自己的知識庫。

          1.題目一

          求下面代碼輸出:

          #include "stdio.h"
          struct node
          {

              int a;
              int b;
              int c;
          };
          int main()
          {
              struct node  s= {356};
              struct node *pt = &s;
              printf("%d" ,  *(int*)pt);
          }

          解析,把pt的指針指向類型從struct node結構體變成int,這時候取到的是struct node前4個字節(jié)的數(shù)據(jù)作為int值,所以結果應該是 3

          weiqifa@bsp-ubuntu1804:~/c/cpu$ gcc 1.c && ./a.out
          3
          weiqifa@bsp-ubuntu1804:~/c/cpu$

          2.題目二

          說明下面函數(shù)foo的功能。

          #include "stdio.h"
          int fooint x , int  n) 
          {
              int val = 1;
              if (n>0)
              {
                  if (n%2 == 1)  val = val *x;/*如果是奇數(shù),就要再乘一次*/
                  val = val * foo(x*x , n/2);/*遞歸*/
              }
              return val;
          }

          int main()
          {
              printf("%d" ,foo(2,3));
          }

          解析 foo 函數(shù)功能:

          foo 是遞歸函數(shù),遞歸函數(shù)的返回方式是通過判斷 n>0 。如果n<0后遞歸就會出棧,我們輸入 x = 2n = 3來驗證一下這個函數(shù)。

          • 第一步,n = 3 大于0,n%2 = 1 執(zhí)行 val = val * 2 , 結果 val = 2。執(zhí)行 val = 2 * foo( 2*2 , 1 ) 。
          • 第二步,x = 4,n =1,這個時候,n還是大于0,還是n%2 = 1, val = val * x ,val = 4, val = 4 * foo(4*4 ,0)。
          • 第三步,x = 16 , n = 0, 這個時候就退出遞歸函數(shù),返回 val =1。

          所以foo的返回值就是 2*4*1 = 8 也就是 2 的 3次方,x的n次方。

          3.題目三

          給出數(shù)列 {1,1,2,3,5,8,13,21}; 求這個數(shù)列的第n項的多少?用C語言實現(xiàn)。

          這個是一個算法編程題,從第三項開始,M(n) = M(n-1) + M(n-2),所以我就想到用遞歸來完成這個題目。

          代碼如下:

          #include "stdio.h"
          #include "string.h"

          int input[] = {1,1,2,3,5,8,13,21};
          long long jisuan(int n)
          {
              long long sum = 0;
              if(n <= 2return 1;
              sum = jisuan(n-1) + jisuan(n-2);
              return sum;
          }

          int main()
          {
              printf("ll%d\n",jisuan(7));
              return 0;
          }

          輸出結果:

          weiqifa@bsp-ubuntu1804:~/c/cpu$ gcc mianshi.c && ./a.out
          13
          weiqifa@bsp-ubuntu1804:~/c/cpu$

          因為遞歸函數(shù)性能比較差,用遞歸不是一個非常好的解決方法,如果不用遞歸實現(xiàn)呢?

          代碼如下:

          #include "stdio.h"
          #include "string.h"
          #include "stdlib.h"

          int input[] = {1,1,2,3,5,8,13,21};

          long long jisuan2(int n)
          {
              int *a,i;
              long long sum;
              a=(int *)malloc(sizeof(int)*n);//分配動態(tài)數(shù)組。
              a[0]=a[1]=1;
              for(i = 2; i<n; i ++)
              {
                  a[i]=a[i-1]+a[i-2];//這里就是通項公式的一種實現(xiàn)形式。
              }
              sum = a[n-1];//保存結果
              free(a);//釋放動態(tài)數(shù)組
              return sum;//返回結果值。
          }
          int main()
          {
              printf("%lld\n",jisuan2(7));
              return 0;
          }

          代碼輸出:

          weiqifa@bsp-ubuntu1804:~/c/cpu$ gcc mianshi.c && ./a.out
          13
          weiqifa@bsp-ubuntu1804:~/c/cpu$

          4.題目四

          求兩個大數(shù)相加,這兩個大數(shù)肯定是超過最長數(shù)據(jù)類型的長度的,所以只能用字符串來操作。

          在算法部分是每一位相加,如果相加后的數(shù)值超過10,就需要考慮進位。

          代碼如下:

          #include "stdio.h"
          #include "string.h"

          int main()
          {
              char a1[100] =  "1111111333123412431234";
              char a2[100] =  "2222222194112312312341234123423";
              char sum[100] = {0};
              int len1,len2,i,j=0;
              len1 = strlen(a1)-1;
              len2 = strlen(a2)-1;
              for( i = (len1>len2)?len1:len2;i>=0;i--)
              {
                  if(len1 >= 0 && len2 >= 0){
                      sum[i] = ( (a1[len1] -0x30) + (a2[len2] - 0x30) + j)%10 + 0x30;
                      j   = ((a1[len1] -0x30) + (a2[len2] - 0x30))/10;
                  }else if(len1 >= 0 && len2 < 0){
                      sum[i] = ( (a1[len1] -0x30) + j)%10 + 0x30;
                      j = 0;
                  }else if(len2 >= 0 && len1 < 0){
                      sum[i] = ( (a2[len2] -0x30) + j)%10 + 0x30;
                      j = 0;
                  }
                  len1 --;len2 --;
              }

              printf("\n%s\n",sum);
              return 0;
          }

          代碼輸出:

          weiqifa@bsp-ubuntu1804:~/c/cpu$ gcc 3.c && ./a.out
          2222222195223423645464646554657
          weiqifa@bsp-ubuntu1804:~/c/cpu$






          推薦閱讀:

          專輯|Linux文章匯總
          專輯|程序人生
          專輯|C語言
          我的知識小密圈

          關注公眾號,后臺回復「1024」獲取學習資料網(wǎng)盤鏈接。

          歡迎點贊,關注,轉(zhuǎn)發(fā),在看,您的每一次鼓勵,我都將銘記于心~



          瀏覽 69
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲日本Ⅴa中文字幕无码 | 五月伊人婷婷 | 乱熟女高潮一区二区在线观看 | 免费视频在线观看一区 | 亚洲综合精品久久婷婷无码专区 |