总结了几个比较经典的笔试题目,这些题目是在面试中遇到的,有难度,但是不是那种特别难的,比较有代表性,如果正在找工作的话,可以看看,丰富一下自己的知识库。
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」获取学习资料网盘链接。
欢迎点赞,关注,转发,在看,您的每一次鼓励,我都将铭记于心~