第二章 C语言之牛客网刷题

# :fire:全网最火特辑:fire: 第二章 C语言之牛客网刷题:book:笔记 【:dizzy:点进来保证让知识充实你一整天】

![在这里插入图片描述](https://img-blog.csdnimg.cn/78e461a171854501b09476f6b3e3b10f.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBARHJlYW1fWS5PY2Vhbg==,size_11,color_FFFFFF,t_70,g_se,x_16#pic_center)


<hr style=" border:solid; width:100px; height:1px;" color=#000000 size=1">





# 前言

> 同学们,新的学期早已开始啦:kissing_closed_eyes:~相信大家都想在这学期偷偷地卷”死“同学吧:innocent:<font color=orange>大学里里可以做的事情有很多哦,我们一定要好好地利用好这段时间,努力地提升自己,大胆放手一搏吧!:fist:
>  <center><font color = red>  星光不负赶路人,时光不有心人 </center>
>  
> 只要我们以深深地谦卑去忍耐 **“暗无天日”** 的日子,定会迎来属于我们**豁然开朗**地一刻!**让我们一起为心中所想,去奋斗吧**!!


<font color=gray size=3>**以下内容干货满满,跟上步伐吧~**

<hr style=" border:solid; width:100px; height:1px;" color=#000000 size=1">

# 一、选择题【全面深度剖析】
<br>

## Ⅰ. 考点:转义字符的理解和应用
1、以下程序段的输出结果是()
```c
#include<stdio.h>

int main()
{
    char s[] = "\\123456\123456\t";
    printf("%d\n", strlen(s));
    return 0;
}

```
A: `12`  B: `13`  C: `16`  D: `以上都不对`


> :see_no_evil:大家觉得答案是什么呢
>
> *********************************************************
> :hear_no_evil:答案是 **A** 啦~



:speak_no_evil: 如果有疑惑,且听我细细分析呀

>本题的主要考点:<u>“**转义字符和strlen函数的应用**

通俗易懂来说:`转义字符`就是<mark>C语言中表示字符的一种特殊形式。</mark>转义字符以<mark>反斜' \ '开头</mark>,后面跟<mark>一个字符</mark>或<mark>一个八进制</mark>或<mark>十六进制数</mark>表示。**转义字符具有特定的含义,不同于字符原有的意义.**

> 即`转义字符`<font color = green>既可以将原本无意义的字符【eg:\t、\n、\123…】转换为有意义的字符</font><font><font color = pink>也可以将原来有意义的字符转换为无意义【eg:\ \ 、\ "……】<font color =  #2E3092>(即这些被转义成“无意义的”可以正常输出了,不会被编译器认为是具有特殊意义的字符)


> 所以:
> `\\`在这里当作`一个字符长度`<font color = red>【将右边那个`\`无意义了,所以在计算长度的时候只看作一个】</font>
> `\123`在这里被转义了,对照ASCII表可知,得出来的字符为`{`<font color = red>【所以也只看作一个字符】</font>
> `\t`合在一起表示的是`制表图`<font color = red>【数的时候只看作一个字符】</font>

 **<font color = #FF7F00>所以数下来一共三处被转义,所以字符长度为`12`</font>**










<hr style=" border:solid; width:100px; height:1px;" color=#000000 size=1">




## Ⅱ.考点:`#define`宏定义的理解和应用
2、若有以下程序,则运行后的输出结果是( )
```c
include <stdio.h>
#define N 2
#define M N + 1
#define NUM (M + 1) * M / 2

int main()
{
    printf("%d\n", NUM);
    
    return 0;
}
```
A: `4` 

B: `8 `

C: `9` 

D: `6`




 > :see_no_evil:同学们觉得答案是什么呢
>
> *********************************************************
> :hear_no_evil:答案是 **D** 啦~


:speak_no_evil: 如果同学们有疑惑,且听我细细分析呀

> 本题主要考点:**<u>“`#define`宏定义的理解和应用”</u>**


**在解题前,让我们先了解了解什么是 `宏定义`**

> C语言中,可以用 `#define` 定义一个标识符来表示一个`常量`【那在内存中就储存在`静态区`】
>  该命令允许把<mark>一个名称指定成任何所需的文本</mark>,例如<mark>一个常量值或者一条语句</mark>。在定义了宏之后,<font
> color = red>无论宏名称出现在源代码的何处,预处理器都会把它用定义时指定的文本**替换**掉。<font color =
> grey>【惯例将宏名称每个字母采用大写,这有助于区分宏与一般的变量】

<font color = green>即通俗来说,就是将在程序中出现的 **宏名** **直接替换** 成 **指定的文本**

经过以上了解后,我们再看回题目

> 我们就可以将`#define`定义的内容在程序中<font color =  #D98719>**直接取代**、**替换成**</font>**<mark>我们所定义的“内容”**</mark>

```c
include <stdio.h>
#define N 2
#define M N + 1
#define NUM (M + 1) * M / 2

int main()
{
    printf("%d\n", NUM);
    //N = 2
    //M = N + 1 
    //NUM = (M+1) * M / 2 = 【替换后】 = (N + 1 + 1) * N + 1 / 2 
    //NUM = (2 + 1 + 1) * 2 + 1 / 2 = 8.5
    
    //但是以整型打印出来的,所以打印的结果为 8 
    
    return 0;
}
```
**特别注意**:`#define`所替换的文本是`直接替换的`,不会考虑什么计算顺序的数学概念

> **`易错`:所以上面如果是`直接先带值计算`出`M`的值的话,那本题就极易算出易错答案`B`**


>> 所以,这类题型<font color = red>**一定要全部替换**</font>后<font color = red>【**不急着算答案**】</font>,<font color =   puple>要看清楚最后正真的计算式后,才能知道这条式子最终的模样!
>

> **以免范上面的错误,误选错误答案哦~**


<font color = blue>**!!!所以为了避免错误,建议全部替换后,再带值进行计算!!!**</font>

<font color = grey>这类题型是不是很可爱呢:kissing_closed_eyes:~









<hr style=" border:solid; width:100px; height:1px;" color=#000000 size=1">


## Ⅲ.考点:`satitic`静态局部变量的理解和应用

3、如下函数的 `f(1)` 的值为()
```c
int f(int n)
{
    static int i = 1;
    
    if(n >= 5)
    {
        return n;        
    }
    
    n = n + i;
    i++;
    
    return f(n);
}
```
A: `5`  B: `6`  C: `7`  D: `8`

> :see_no_evil:同学们觉得答案是什么呢
>
> *********************************************************
> :hear_no_evil:答案是 **C** 啦~

:speak_no_evil: 如果同学们有疑惑,且听我细细分析呀

> 本题主要考点:**<u>“`satitic`静态局部变量的理解和应用”</u>**

我们先来简单了解什么是`static`

<font color = green>简易来说:`static`在修饰函数的局部变量的时候,会改变变量的属性</font>
<font color = #9F5F9F>即它会使变量具有`常属性`,称为:`常变量`
【但本质还是`变量`,只不过具有`常量的属性`】
【<mark>改变了变量在内存中的储存空间</mark>(临时变量一般在`栈区`中开辟内存,现在将`static`所修饰的变量在`静态区`开辟了空间)】</font>

> **这也是为什么会具有**`“常属性”`
> ****
>**这也就说明**:**被`static`修饰的变量改变了自己的作用`生命周期`【作用域不变】**


经过短暂的认识后,再看回题目:

> **static改变了i的生命周期**
> <font color = gren>【即`i`的值不会被重新创建和销毁,值不随函数退出而消失,而要保留到下一次被访问】</font>
> **第一次调用函数:** `i`初值是`1`
> **递归第二次调用函数时**,`i`还是第一次那个变量,值已经变成了`2`
>**再一次调用函数时**:`i`就是`3`
>...
>
><mark>依次类推</mark>


这样可知:![在这里插入图片描述](https://img-blog.csdnimg.cn/68c3c0e0cd9e4a45bf06a1a9f18ead3d.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBARHJlYW1fWS5PY2Vhbg==,size_20,color_FFFFFF,t_70,g_se,x_16)
<mark>**答案便是:** **n =** `7`**啦~~**</mark>







<hr style=" border:solid; width:100px; height:1px;" color=#000000 size=1">

## Ⅳ.考点:`const`对指针的理解和应用
4、下面3段程序代码的效果一样吗( )

```c
int b;

(1)const int *a = &b;

(2)int const *a = &b;

(3)int *const a = &b;
```
A: `(2)=(3)` B: (`1)=(2) `C: `都不一样` D: `都一样`

> :see_no_evil:同学们觉得答案是什么呢
>
> *********************************************************
> :hear_no_evil:答案是 **B** 啦~

:speak_no_evil: 如果同学们有疑惑,且听我细细分析呀

> 本题主要考点:**<u>“`const`对指针的理解和应用”</u>**

<font color  = orange>我们先了解`const`对指针的作用是怎么样的</font>

```c
1.const如果在指针变量的 “ * ” 的左边
【即 const int * a == int const * a】 
== 表达的意思是:对 指针变量a 解引用的值是保持不变的
【只有a里面存放的地址改变了,解引用出来的值才会变化】
```

```c
2.const如果在指针变量的 “ * ” 的右边
【即 int * const a】
== 表达的意思是:a里面 存放的地址是保持不变
【只有 主动对 *a 赋值才能改变这个值,但a里面的地址是一直保持不变的】
```
==简记为`"左定值,右定向"`【以`*`为标记】==

<font color = pink>所以 (1)和(2)const都在*的左边,(3)中const在*的右边</font>

<font color = red>**所以应该选择B**</font>






<hr style=" border:solid; width:100px; height:1px;" color=#000000 size=1">

## Ⅴ.考点:综合考点

5、对于下面的说法,正确的是( )
A: `对于 struct X{short s;int i;char c;},sizeof(X)等于sizeof(s) + sizeof(i) + sizeof(c)`
B: `对于某个double变量 a,可以使用 a == 0.0 来判断其是否为零`
C:`初始化方式 char a[14] = "Hello, world!"; 和char a[14]; a = "Hello, world!";的效果相同`
D:`以上说法都不对`
 > :see_no_evil:同学们觉得答案是什么呢
>
>
> *********************************************************
> :hear_no_evil:答案是 **D** 啦~

:speak_no_evil: 如果同学们有疑惑,且听我细细分析呀

> 本题主要考点:**<u>“综合考点【且听我分析喔~】”</u>**


> **A.** 结构体 在内存中的存储 需要进行`内存对齐` ==所以不能直接简单地将成员变量的类型大小相加就认为是结构体的总内存大小==

> **B.** 考察`double类型的比较`,由于浮点数存在误差,==不能直接判断两个数是否相等==,通常采
用<font color = gren>**比较两数之差的绝对值是否小于一个很小的数字**(具体的可自己设定这样一个数,作为误差)**来确定是否相等**</font  >


> **C.**  **`a`为数组首地址是常量不能改变** ==【常量是永远不能变的】==


> **D.** **√**








<hr style=" border:solid; width:100px; height:1px;" color=#000000 size=1">

# 二、编程题【全面深度解析】

<br>

## Ⅰ.【牛客网题号: `HJ76` 尼科彻斯定理】【难度:`简单`】
1、验证尼科彻斯定理,即:任何一个整数` m` 的立方都可以写成` m` 个连续奇数之和。例如:

 - 输入一个正整数 m(m≤100) ,将 `m `的立方写成 `m `个连续奇数之和的形式输出
 -  将 `m `的立方写成 `m `个连续奇数之和的形式输出
 
:mag:题目传送门:[OJ链接](https://www.nowcoder.com/practice/dbace3a5b3c4480e86ee3277f3fe1e85?tpId=37&&tqId=21299&rp=1&ru=/ta/huawei&qru=/ta/huawei/question-ranking)

```c
示例:
输入:6
输出:31+33+35+37+39+41
```
<font color = red>注意:</font>

>本题含有多组输入数据

> `!!!解题关键:等差数列的和!!!`
> 这道题的关键在于知道规律后,运用高中学过的知识:`求等差数列的和`的`公式`来计算即可

<font color  = green>实现:

```c
#include <stdio.h>

int main()
{
    int m = 0;
    while(scanf("%d",&m) != EOF)
    {
        int i = 0;
        int begin = m*(m-1)+1; // 
        printf("%d",begin); //先把首元素记下来
    
        for(i=0;i<m-1;i++)
        {
            begin += 2;
            printf("+%d",begin);
        }
        printf("\n");
    }
    
    return 0;
}
}

```

<hr style=" border:solid; width:100px; height:1px;" color=#000000 size=1">

## Ⅱ.【牛客网题号: `HJ100` 等差数列】【难度:`简单`】
等差数列  `2,5,8,11,14, ... `(从 `2 `开始的 `3 `为公差的等差数列),求等差数列前` n `项和。

 - 输入描述:输入一个正整数` n `。
 - 输出描述:输出一个相加后的整数。

:mag:题目传送门:[OJ链接](https://www.nowcoder.com/practice/f792cb014ed0474fb8f53389e7d9c07f?tpId=37&&tqId=21323&rp=1&ru=/ta/huawei&qru=/ta/huawei/question-ranking)

```c
示例:
输入:2       输入:275
输出:7       输出:113575
说明:2+5=7   说明:2+5+...+821+824=113575
```
<font color = red>思路:</font>



> - **1.** 这道题比上一道题目更加的明显,只需要了解了**等差数列求和公式**` Sn=n(a1+an)/2 `就简单了 ,根据题目得知 `a1=2 `,而等差数列第`n`项也有具体公式`an=a1+(n-1)d` ,而公差为`3`, 这时候只需要**套入公式计算**即可
>  - **2.** 或者`记录下求出的每一项,并相加` 就是`等差数列的和`


 
<font color  = green>实现:

```c
#include <stdio.h>

int main()
{
    int n = 0;
    
    while(scanf("%d",&n) != EOF)
    {
        int i  = 0;
        int sum =0;  
        for(i=0;i<n;i++)
        {
            sum += 2+3*i; //直接算出每一项,顺便求和 就是 等差数列的和
                          //【等差数列的和 = 每一项之和】
        }
        printf("%d\n",sum);
    }
    
    return 0;
}
```

<hr style=" border:solid; width:100px; height:1px;" color=#000000 size=1">

# <b>🌐</b> 如何高效学习数据结构与算法?

<br>

<kbd>数据结构与算法</kbd>的学习还是得`基础知识`➕`自己动手`同步进行

如果是初学者,需要找一个可以在线练习得网站,我建议你去[牛客网](https://www.nowcoder.com/link/pc_csdncpt_dream_sf)多练习呀(快点击跳转学起来吧!)


 
 >![在这里插入图片描述](https://img-blog.csdnimg.cn/0111a380a1784f7eb4a5078705c3ab69.png)


就如上述讲解的面试OJ题,[牛客网](https://www.nowcoder.com/link/pc_csdncpt_dream_sf)内还有大神提供题解思路,对新手玩家及其友好,有不清楚的语法,不理解的地方,看看别人的思路,别人的代码,也许就能豁然开朗~

<hr style=" border:solid; width:100px; height:1px;" color=#000000 size=1">

# 总结
综上,特辑的第二章呐:lollipop:~ <font color=black>

让我们大家一同在平凡的生活中<font color = red>**奔赴热爱**</font >吧~

毕竟,

<font color  = purple>**“热爱的东西 永远不要说放弃”**

:dizzy:**如果有错误❌,欢迎指正呀**:dizzy:

**:sparkles:如果觉得收获满满,可以点点赞👍支持一下哟~:sparkles:**
![在这里插入图片描述](https://img-blog.csdnimg.cn/60fdeb4b91324bbbbe67b70a1aa0e71d.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBARHJlYW1fWS5PY2Vhbg==,size_16,color_FFFFFF,t_70,g_se,x_16#pic_center)

全部评论

相关推荐

白火同学:能。我当初应届沟通了1200,收简历50,面试10左右吧,加油投吧
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务