解剖幾個有點難度的C筆試題
總結了幾個比較經(jīng)典的筆試題目,這些題目是在面試中遇到的,有難度,但是不是那種特別難的,比較有代表性,如果正在找工作的話,可以看看,豐富一下自己的知識庫。
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個字節(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 foo( int 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 = 2 和 n = 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 <= 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$
因為遞歸函數(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$

評論
圖片
表情
