1.题目一
求下面代码输出:
#include "stdio.h"
struct node
{
int a;
int b;
int c;
};
int main()
{
struct node s= {5, 6, 7};
struct node *pt = &s;
printf("%d" , *(int*)pt);
}
2.题目二
给出数列 {1,1,2,3,5,8,13,21}; 求这个数列的第n项的多少?用C语言实现(使用递归)。
3.题目三
说明下面函数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,2));
}
4.题目四
求两个大数相加,例如:
#include "stdio.h"
#include "string.h"
int main()
{
char a1[100] = "1111111333123412431234";
char a2[100] = "2222222194112312312341234123423";
// ...以下是需要补充代码
}
参考答案:
题目一答案:5
题目一解析:
struct node s= {5, 6, 7}; 这句相当于给s里面的变量a,b,c进行了赋值,分别赋值为了5,6,7。
struct node *pt = &s; 这句是声明一个指针pt,并且指向了s这个结构体变量,指向的类型是结构体类型node。
printf("%d" , *(int*)pt); 这句相当于把原本指向的node的结构体类型的pt指针,强转成了变成指向int型,这时候通过*去取指针所指的变量的值的时候,取回来的是结构体s的前4个字节的数据作为int的值,所以输出的结果应该为5。
题目二解析:
这道题的数列便是大名鼎鼎的斐波那契数列,首先我们可以通过观察,找到这个数列的规律是 F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=3,n∈N*),用普通递归的参考答案:
#include "stdio.h"
#include "string.h"
int input[] = {1,1,2,3,5,8,13,21};
int fib(int n)
{
int sum = 0;
if(n <= 2) return 1;
sum = fib(n-1) + fib(n-2);
return sum;
}
int main()
{
printf("%d\n",fib(7));
return 0;
}
题目三解析:
foo 是递归函数,这里只要n>0,就会一直递归下去 。如果n<0后递归就会出栈,我们输入 x = 2 和 n = 3来看看执行一下函数运行过程:
- 第一步,n = 3 ,由于是大于0的,n%2 = 1 执行 val = val 2 , 结果 val = 2。接着执行 val = 2 * foo( 22 , 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的返回值就是 241 = 8 也就是 2 的 3次方,所以这个函数是用来求x的n次方。
题目四参考代码如下:
#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;
}
代码输出:
2222222195223423645464646554657
我是小钱嵌入式,会不断的和大家分享嵌入式相关的内容,智能化时代的到来,促就了未来一定是个全民编程的时代 ,如果你觉得我的分享对你有些帮助,请不要吝惜你的点赞和关注原创写作不易,兄弟姐妹们的点赞和关注,就是我分享最大的动力,谢谢!,欢迎在评论区和我一起讨论。