🔥个人主页:艾莉丝努力练剑
❄专栏传送门:《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
结语:感谢大家的阅读,记得给博主“一键四连”,感谢友友们的支持和鼓励!