总结了几个比较经典的笔试题目,这些题目是在面试中遇到的,有难度,但是不是那种特别难的,比较有代表性,如果正在找工作的话,可以看看,丰富一下自己的知识库。
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关注打赏


微信扫码登录