【牛客刷题】/*关于C学习过程中的经典习题剖析*/

简介: 【牛客刷题】/*关于C学习过程中的经典习题剖析*/

   🥤🥤嗨嗨嗨!各位小伙伴们,我依旧是你们熟悉的那个……额,理想很远大,自己却很平凡,但一直努力的小白啦🤡。

 

   🚈🚈那么最近呢,一直在不断更新C语言的知识点,那么大概在七月二十日左右,应该就会陆续更新 java部分的知识点啦,毕竟C知识入门语言,把根基打牢,才能盖出属于自己的大楼🤟!!

 

   🎋🎋好了,回归正题,今天要更新的就是一些我在C语言的学习过程的部分经典习题分享,还希望看完的小伙伴们一键三连,谢谢啦 🥞!

正文开始:

一、经典垃圾代码

🍎首先先看一个经典的例子:

   #include <stdio.h>

   int main()

   {

       int i = 1;

       int ret = (++i)+(++i)+(++i);

       printf("ret = %d\n", ret);

    return 0;

   }

   🍊代码解读:

   表达式(++i)+(++i)+(++i),只有操作符的优先级和结合性,没法确定唯一计算路径

   所以这个表达式可能因为计算顺序的差异导致结果是不一致的,所以表达式是错误的表达式。

   可以在VS和Linux gcc测试,结果是有差异的!!🍫🍫

二 、虾仁猪心

   🛸🛸这道题也是非常坑的一道题,如果对C语言知识点掌握的不牢靠的话,很容易踩坑:

   #include <stdio.h>

   int i;

   int main()

   {

       i--;

       if (i > sizeof(i))

       {

           printf(">\n");

       }

       else

       {

           printf("<\n");

       }

       return 0;  

   }

   🍎代码解读:

   C语言中,0为假,非0即为真。

   全局变量,没有给初始值时,编译其会默认将其初始化为0。

   i的初始值为0,i--结果-1,i为整形,sizeof(i)求i类型大小是4,按照此分析来看,结果应该选择B,但是sizeof的返回值类型实际为无符号整形,因此编译器会自动将左侧i自动转换为无符号整形的数据,-1对应的无符号整形是一个非常大的数字,超过4或者8,故实际应该选择A

   这道题其实很隐蔽,真是虾仁猪心🍖🍖!!!

三、X形图案

🍎问题描述:

🍭从键盘输入一个整数比如5,6等等。

🍿输出样式:

*   *

* *  

 *  

* *  

*   *

   🍵🍵问题分析:我们可以看到输出结果是由一个X形的*组成的图案,我们可以将其想象成一个5*5的矩阵 ,通过两层for循环的方式来控制矩阵的行和列,我们发现当行和列相等的时候都要打印*,那么右斜线就打印好了,左斜线的行+列的和始终等于我们的n-1,OK按照这个思路我们来设计求解方法:👇

   #include <stdio.h>

   int main()

   {

     int n = 0;

     while(scanf("%d", &n) != EOF)

     {

         for(int i=0; i<n; i++)  //外循环为行

         {

            for(int j=0; j<n; j++) //内循环为列

            {

                if(i == j || i+j == n-1)  

        //最关键的地方,正斜线为[i][i]处是*, 反斜杠为[i][n-1-j]处是*,一行打印1个或2个*

                    printf("*");

                else

                    printf(" ");

            }

            printf("\n"); //打印完一行,换行

         }

     }

     return 0;

   }

四、获得月份天数

   🍊问题描述:输入年份和月份,计算这一年这个月有多少天。

   🍎问题思路:这一题关键就是这个月份天数我们怎么去实现,尤其是二月份闰年有29天,非闰年有28天,怎么让程序知道这一年是闰年呢(使用if语句来判断),我们可以将每个月的天数放在一个数组里面,然后根据输入是否为闰年,来输出我们的结果:

   #include<stdio.h>

   int fun(int y)

   {

    return ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0);

   }

   int main()

   {

    int y = 0;

    int m = 0;

    int d = 0;

    int days[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };

    while (scanf("%d%d", &y, &m) == 2)

    {

     int d = days[m];

     if (fun(y) == 1 && m == 2)

     {

      d++;

     }

     printf("%d\n", d);

    }

    return 0;

   }

五、逆序输出一个字符串的内容

   🍏问题描述:

   🍐输入: I am a student

   🍒输出:tneduts a ma I

   #include <stdio.h>

   #include <string.h>

   int main()

   {

    char str1[100];

    char str2[100];

    int a, i;

    gets(str1);

    a = strlen(str1);

    for (i = 0; i < a; i++)

    {

     str2[i] = str1[a - 1 - i];

    }

    str2[i] = 0;

    printf("%s", str2);

   }

六、计算求和

   🍎问题描述:

   假设求Sn=a+aa+aaa+aaaa+aaaaa的前5项之和,其中a是一个数字,

   例如:2+22+222+2222+22222

   🍈问题分析:通过给出的问题描述可以发现,需要求和的第i项有i个a,所以可以假设第i项为temp,则第i+1项为temp*10+a;

🍔🍔代码实现:

   #include<stdio.h>

   int main()

   {

    int a = 0;

    int n = 0;

    int i = 0;

    int sum = 0;

    int tmp = 0;

   

   

    scanf("%d%d", &a, &n);

    for(i=0; i<n; i++)

    {

     tmp = tmp*10+a;

     sum += tmp;

    }

    printf("%d\n", sum);

   

    return 0;

   }

相关文章
|
5月前
|
人工智能 算法 BI
【AcWing算法基础课】第四章 数学知识(未完待续)(2)
从2到n枚举每个数,删掉其所有的倍数,枚举完之后,没有被删掉的数为质数。
47 0
|
5月前
|
存储 人工智能 算法
【AcWing算法基础课】第四章 数学知识(未完待续)(3)
根据下面公式来预处理出等式右边的组合数的值,那么等式左边就可以用等式右边已经算过的值来进行计算(有点像dp)。
56 0
|
5月前
|
人工智能 算法
【AcWing算法基础课】第四章 数学知识(未完待续)(1)
利用秦九韶算法来实现其他进制转十进制的结果求解
50 0
|
9月前
|
前端开发 JavaScript 程序员
分析几道经典但依然超难做的前端面试题
分析几道经典但依然超难做的前端面试题
|
C++
来源于《高质量C/C++编程》的几道经典面试题
.str传给p的时候,p是str的临时拷贝,有自己的独立空间,当GetMemory函数内部申请了空间后,地址放在p中,str仍然是NULL。当Getmemory函数返回之后,strcpy拷贝的时候,形成了非法访问。
150 0
|
机器学习/深度学习 C++ iOS开发
C++ 基础复习系列 05 (题目汇总)
C++ 基础复习系列 05 (题目汇总)
79 0
|
机器学习/深度学习 C++ iOS开发
C++ 基础复习系列5(题目汇总)
C++ 基础复习系列5(题目汇总)
C++ 基础复习系列5(题目汇总)
|
算法
算法刷题——7.3习题
算法刷题——7.3习题
算法刷题——7.3习题