【C语言16天强化训练】从基础入门到进阶:Day 2


🔥个人主页艾莉丝努力练剑

❄专栏传送门:《C语言》《数据结构与算法》C语言刷题12天IO强训LeetCode代码强化刷题洛谷刷题C/C++基础知识知识强化补充C/C++干货分享&学习过程记录

🍉学习方向:C/C++方向

⭐️人生格言:为天地立心,为生民立命,为往圣继绝学,为万世开太平

前言:距离学完C语言已经过去一段时间了,在学习了初阶的数据结构之后,博主要更新的内容是C语言16天强化训练,之前博主更新过一个【C语言刷题12天IO强训】的专栏,那个是从入门到进阶的IO模式真题的训练。今天依然是训练五道选择题和两道编程算法题,希望大家能够有所收获!



目录

正文

一、五道选择题

[1.1 题目1](#1.1 题目1)

[1.2 题目2](#1.2 题目2)

[1.3 题目3](#1.3 题目3)

[1.4 题目4](#1.4 题目4)

[1.5 题目5](#1.5 题目5)

二、两道算法题

[2.1 尼科彻斯定理](#2.1 尼科彻斯定理)

题目理解:

[2.2 等差数列](#2.2 等差数列)

题目理解:

结尾


正文

一、五道选择题

1.1 题目1

**题干:**以下程序段的输出结果是( )

cpp 复制代码
#include<stdio.h>
int main()
{
    char s[] = "\\123456\123456\t";
    printf("%d\n", strlen(s));
    return 0;
}

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

**解析:**主要注意以下这几个点------

(1)\\ 是一个转义字符,表示一个反斜**\**字符;

(2)\123(\ddd)是一个八进制转义字符,\123表示ASCII码值为83的字符('S');

(3)\t 是一个转义字符,"tab对齐",表示制表符。

这样一来实际上就只有\ddd,1,2,3,4,5,6,S,4,5,6,\t 这12个字符啦。

1.2 题目2

**题干:**若有以下程序,则运行后的输出结果是( )

cpp 复制代码
#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

解析:这道题非常简单,我们之间展开宏,宏展开后为((N+1)+1)*(N+1)/2,我们再代入N=2,我们得到((2+1)+1)*(2+1)/2,即D

1.3 题目3

**题干:**如下函数的 f(1) 的值为( )

cpp 复制代码
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

**解析:**这道题中的递归过程是f(1)->f(2)->f(4)->f(7),当n=7的时候,满足n>=5,返回7。

因为每次n=n+i,i++,在函数递归调用f(n),最终结果就是返回7。static int i 在递归过程中会持续累加(每次调用i++),递归终止条件是n >= 5,最后一次返回的是n = 7选择C

1.4 题目4

**题干:**下面3段程序代码的效果一样吗( )

cpp 复制代码
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. 都一样

解析:(1)const int *a = &b;和(2)int const *a = &b;等价,即指针指向的int是常量;而(3)int *const a = &b;是指针本身变成了常量,两者效果不一样。即一个选择B. (1)=(2)

1.5 题目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. 以上说法都不对

解析:A选项错误------结构体有内存对齐,B选项错误------浮点数直接比较不精确,C选项错误------数组不能直接赋值字符串,排除法,我们选择D. 以上说法都不对**。**

选择题答案如下:

1.1 A

1.2 D

1.3 C

1.4 B

1.5 D

大家都做对了吗?

二、两道算法题

2.1 尼科彻斯定理

题目链接:HJ76 尼科彻斯定理

题目描述:

题目理解:

对任意正整数 n,输出由 n 个连续奇数组成的数列,其和等于 n 的立方。数列元素用加号连接。

这道题也是IO型的,下面是C语言的模版(IO型就不用管它们了)------

代码演示:

cpp 复制代码
#include <stdio.h>

int main() 
{
    int n;
    scanf("%d", &n);
    int start = n * n - n + 1; // 计算起始奇数
    for (int i = 0; i < n; i++) 
    {
        printf("%d", start + 2 * i); // 输出当前奇数
        if (i < n - 1) 
        {
            printf("+"); // 非最后一个元素时输出加号
        }
    }
    printf("\n");
    return 0;
}

这道题是C语言中一道比较经典的题目。

时间复杂度O(n)

空间复杂度O(1)

我们如果学习了C++也可以尝试用C++实现一下------

cpp 复制代码
#include <iostream>
using namespace std;

int main() 
{
    int n;
    while (cin >> n) 
    { // 处理多组输入
        int start = n * n - n + 1; 
        // 计算起始奇数
        for (int i = 0; i < n; i++) 
        {
            cout << start + 2 * i;  
            // 输出当前奇数
            if (i < n - 1) 
            {
                cout << "+";        
            // 非最后一个元素时输出加号
            }
        }
        cout << endl;               
        // 这里要记得换行
    }
    return 0;
}

时间复杂度:O(n),空间复杂度:O(1)

这个目前要写出来非常考验C++的学习情况,大家可以尝试去写一写,优先掌握C语言的写法,博主还没有介绍C++的算法题,之后会涉及的,敬请期待!

2.2 等差数列

题目链接:HJ100 等差数列

题目描述:

题目理解:

本题就是要求计算首项为2,公差为3的等差数列前n项的和。

这道题也是IO型的,下面是C语言的模版(IO型就不用管它们了)------

代码演示:

cpp 复制代码
#include <stdio.h>

int main() 
{
    int n;
    scanf("%d", &n);
    int sum = n * (2 * 2 + (n - 1) * 3) / 2; // 等差数列求和公式
    printf("%d\n", sum);
    return 0;
}

这道题是C语言中一道比较经典的题目。

当然博主还有一个更加简单的解法,这个解法大家理解起来就简单了------

cpp 复制代码
#include <stdio.h>

int main()
{
    int n = 0;
    scanf("%d", &n);
    int Sn = n * (2 + 3 * n - 1) / 2;
    printf("%d", Sn);
    return 0;
}

我们如果学习了C++也可以尝试用C++实现一下------

cpp 复制代码
#include <iostream>
using namespace std;

int main() 
{
    int n;
    while (cin >> n) 
    { 
        // 处理多组输入
        int sum = n * (2 * 2 + (n - 1) * 3) / 2; 
        // 等差数列求和公式
        cout << sum << endl;
    }
    return 0;
}

**时间复杂度:**O(1);

**空间复杂度:**O(1)。

目前要写出来C++的写法是比较考验前面C++的学习情况的,当然大家可以尝试去写一写,优先掌握C语言的写法,博主还没有介绍C++的算法题,之后会涉及的,敬请期待!


结尾

往期回顾:

【C语言16天强化训练】从基础入门到进阶:Day 1

结语:感谢大家的阅读,记得给博主"一键四连",感谢友友们的支持和鼓励!