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

发布于:2025-08-19 ⋅ 阅读:(16) ⋅ 点赞:(0)


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

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

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

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

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



目录

正文

一、五道选择题

1.1  题目1

1.2  题目2

1.3  题目3

1.4  题目4

1.5  题目5

二、两道算法题

2.1  尼科彻斯定理

题目理解:

2.2  等差数列

题目理解:

结尾


正文

一、五道选择题

1.1  题目1

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

#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

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

#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) 的值为( )

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段程序代码的效果一样吗( )

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型就不用管它们了)——

代码演示:

#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++实现一下——

#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型就不用管它们了)——

代码演示:

#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语言中一道比较经典的题目。

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

#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++实现一下——

#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

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


网站公告

今日签到

点亮在社区的每一天
去签到