解剖几个有点难度的C笔试题
總結了幾個比較經典的筆試題目,這些題目是在面試中遇到的,有難度,但是不是那種特別難的,比較有代表性,如果正在找工作的話,可以看看,豐富一下自己的知識庫。
1.題目一
求下面代碼輸出:
#include?"stdio.h" struct?node {int?a;int?b;int?c; }; int?main() {struct?node??s=?{3,?5,?6};struct?node?*pt?=?&s;printf("%d"?,??*(int*)pt); }解析,把pt的指針指向類型從struct node結構體變成int,這時候取到的是struct node前4個字節的數據作為int值,所以結果應該是 3。
weiqifa@bsp-ubuntu1804:~/c/cpu$?gcc?1.c?&&?./a.out 3 weiqifa@bsp-ubuntu1804:~/c/cpu$2.題目二
說明下面函數foo的功能。
#include?"stdio.h" int?foo(?int?x?,?int??n)? {int?val?=?1;if?(n>0){if?(n%2?==?1)??val?=?val?*x;/*如果是奇數,就要再乘一次*/val?=?val?*?foo(x*x?,?n/2);/*遞歸*/}return?val; }int?main() {printf("%d"?,foo(2,3)); }解析 foo 函數功能:
foo 是遞歸函數,遞歸函數的返回方式是通過判斷 n>0 。如果n<0后遞歸就會出棧,我們輸入 x = 2 和 n = 3來驗證一下這個函數。
第一步,n = 3 大于0,n%2 = 1 執行 val = val * 2 , 結果 val = 2。執行 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, 這個時候就退出遞歸函數,返回 val =1。
所以foo的返回值就是 2*4*1 = 8 也就是 2 的 3次方,x的n次方。
3.題目三
給出數列 {1,1,2,3,5,8,13,21}; 求這個數列的第n項的多少?用C語言實現。
這個是一個算法編程題,從第三項開始,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?<=?2)?return?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$因為遞歸函數性能比較差,用遞歸不是一個非常好的解決方法,如果不用遞歸實現呢?
代碼如下:
#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);//分配動態數組。a[0]=a[1]=1;for(i?=?2;?i<n;?i?++){a[i]=a[i-1]+a[i-2];//這里就是通項公式的一種實現形式。}sum?=?a[n-1];//保存結果free(a);//釋放動態數組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.題目四
求兩個大數相加,這兩個大數肯定是超過最長數據類型的長度的,所以只能用字符串來操作。
在算法部分是每一位相加,如果相加后的數值超過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」獲取學習資料網盤鏈接。
歡迎點贊,關注,轉發,在看,您的每一次鼓勵,我都將銘記于心~
總結
以上是生活随笔為你收集整理的解剖几个有点难度的C笔试题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iOS 手势密码锁
- 下一篇: HiJson(Json格式化工具)