日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

解剖几个有点难度的C笔试题

發布時間:2023/12/20 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 解剖几个有点难度的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笔试题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。