解剖几个有点难度的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.out3weiqifa@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 = 2n = 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$

(0)

相关推荐

  • CH5104题解

    CH5104:I-Country题解(线性DP) MDZZ这道题调了2个小时自闭了(( 题意简述 给你一个\(N*M\)的矩阵,每个格子都有一个权值.现在让你寻找一个包含\(K\)个格子的凸连通块,使 ...

  • LeetCode 1128. 等价多米诺骨牌对的数量(简单)

    1128. 等价多米诺骨牌对的数量 给你一个由一些多米诺骨牌组成的列表 dominoes. 如果其中某一张多米诺骨牌可以通过旋转 0 度或 180 度得到另一张多米诺骨牌,我们就认为这两张牌是等价的. ...

  • 50道正则表达式笔试题参考答案(第11-20题)

    各位客官姥爷好,欢迎回来.我们在上节给出了前10道正则表达式练习题目和参考答案,相信各位姥爷都有对照着练习.在本节清风将给出第11-20题的参考答案. PS:在各位客官姥爷跟着清风一起完成本系列的练习 ...

  • 50道正则表达式笔试题参考答案(第21-30题)

    各位客官姥爷好,欢迎回来.我们在上节给出了第11-20道正则表达式题目和参考答案,本节将继续正则表达式系列题目,请看下方第21-30题的参考答案. PS:在各位客官姥爷跟着清风一起完成本系列的练习后, ...

  • 50道正则表达式笔试题参考答案(第1-10题)

    各位客官姥爷好,欢迎回来.我们上节留下的50道正则表达式笔试练习题,有不少客官姥爷在后台回复他自己的答案.[嘿嘿,相信肯定也有偷懒没做的(收藏夹里吃灰).没关系,清风在这里陪您一起做] 一次性做50道 ...

  • 50道正则表达式笔试题参考答案(第31-40题)

    各位客官姥爷好,欢迎回来.我们在上节给出了第21-30道正则表达式题目和参考答案,本节将继续正则表达式系列题目,请看下方第31-40题的参考答案. PS:在各位客官姥爷跟着清风一起完成本系列的练习后, ...

  • 50道正则表达式笔试题参考答案(第41-50题)

    各位客官姥爷好,欢迎回来.我们在上节给出了第31-40道正则表达式题目和参考答案,本节将继续正则表达式系列题目,请看下方第41-50题(数据人表示后面几道工作中最常用) PS:作为50道题目的最后一节 ...

  • 她用十二年的奉献,完美解答了当初来联通时的那道笔试题......

    周霞是山东联通淄博桓台分公司果里乡镇营业厅的一名营业员,自2001年加入联通大家庭以来,在营业岗位上一干就是十二年.十二年来,她始终怀着一颗感恩的心默默奉献着自己的热情,本着为客户服务.为公司创收的原 ...

  • 50道正则表达式笔试题(建议收藏)

    各位客官姥爷好,欢迎回来.我们上节留下的正则表达式小测验,有客官姥爷在后台回复说题目太少,做的不够尽兴.那么本节,清风就为各位客官姥爷搜集整理出50道常考的正则表达式笔试练习题目(基础篇5道和应用篇4 ...

  • python 面试题-收集100+面试题笔试题

    前言 收集了100多道 Python 基础练习题,面试题,笔试题,练完这些题 Python 内功大增!适合python初学者和基础不牢的同学练手. 想刷面试题的也可以多看看,答案在网易云平台课程上ht ...

  • 整理九道关于javascript字符串的笔试题

    整理九道关于javascript字符串的笔试题