一、单项选择题
(共 15 题,每题 2 分,共计 30 分;每题有且仅有一个正确选项)
试卷解析 · 理解每一步
CSPJ-2026-R1-Mock-1
试卷解析总览,可直接查看每题答案与解析。
(共 15 题,每题 2 分,共计 30 分;每题有且仅有一个正确选项)
启动计算机引导操作系统是将操作系统( )。
正确答案D
启动引导程序会把系统盘上的操作系统装入内存,CPU 再执行内存中的系统代码,因此选 D。
在 Linux 终端中创建名为 `notes` 的新目录,应使用命令( )。
正确答案D
`mkdir notes` 用于创建目录;`touch` 通常创建普通文件,`cd` 切换目录,`rm` 删除文件。
已知 `bool a=false, b=true`,表达式 `!a && b` 的值为( )。
正确答案A
`!a` 为 true,再与 b 的 true 进行逻辑与,结果仍为 true。
计算机的运算速度取决于给定时间内其处理器所能处理的数据量。处理器一次能处理的数据量称为字长。已知 64 位的奔腾处理器一次能处理 64 位,相当于( )字节。
正确答案A
1 字节等于 8 位,所以 64 位字长相当于 字节。
算式 的结果是( )。
正确答案A
,,因此 。
在 C++ 中,表达式 `sizeof(char)` 的结果一定是( )。
正确答案A
C++ 规定 `sizeof(char)` 恒等于 1 个字节;一个字节包含多少位由实现决定,但结果仍为 1。
设栈 的初始状态为空,现有 5 个元素组成的序列 ,对该序列在栈 上依次进行如下操作(从序列中的 1 开始,出栈后不再进栈):进栈、出栈、进栈、进栈、出栈、进栈、出栈、进栈。出栈的元素序列是( )。
正确答案D
依次操作得到:1 入栈后弹出 1;2、3 入栈后弹出 3;4 入栈后弹出 4;最后 5 入栈。因此出栈序列为 。
在有 个叶节点的哈夫曼树中,节点总数为( )。
正确答案B
哈夫曼树是严格二叉树,若有 个叶节点,则内部节点有 个,总节点数为 。
电线上停着两种鸟(A 和 B),可以看出相邻的两只鸟将电线划分为一个线段。这些线段可分为两类:一类是线段两端的鸟种类相同,另一类是线段两端的鸟种类不同。已知电线的两个端点处恰好停着种类相同的鸟,那么两端的鸟种类不同的线段数目一定是( )。
正确答案B
沿电线从一端走到另一端,每遇到异种鸟就切换一次种类。两端鸟种相同,切换总次数必为偶数。
从未排序序列中挑选元素,并将其依次放入已排序序列(初始时为空)的一端,这种排序方法称为( )。
正确答案C
选择排序每轮从未排序部分选出一个目标元素,并把它放到已排序部分的一端。
对于一棵满二叉树,若其叶节点数为 、分支节点数为 、总节点数为 ,则下列关系式恒成立的是( )。
正确答案A
满二叉树的节点只分为叶节点和分支节点,所以总节点数恒有 。此外满二叉树满足 ,故 。
执行 `string s = "CSPJ"; cout << s.size();` 后输出( )。
正确答案B
字符串 `CSPJ` 包含 4 个字符,`size()` 返回 4。
已经编译得到程序 `main`,希望从 `input.txt` 读入并把输出写入 `output.txt`,正确的 Linux 命令是( )。
正确答案B
`< input.txt` 把标准输入重定向到文件,`> output.txt` 把标准输出重定向到文件。
已知元素 ,这些元素以( )的顺序全部入栈,再全部出栈,可使栈的出栈顺序满足:8 在 51 之前;90 在 87 之后;20 在 14 之后;25 在 6 之前;19 在 90 之后。
正确答案D
全部入栈后再全部出栈,出栈顺序是入栈序列的逆序。D 逆序后为 ,逐一满足题目给出的五个先后条件。
假设我们用向量 表示无向连通图 的 5 个顶点的度数,下面给出的( )组 值合理。
正确答案A
无向图度数和必须为偶数,且 5 个顶点的简单图中每个度数不超过 4。A 可由一个 5 阶环实现;其余选项或度数和为奇数,或出现度数 5。
程序输入不超过数组或字符串定义的范围;判断题正确填 ✓,错误填 ✗。
1 | #include <iostream>
2 | #include <cmath>
3 | using namespace std;
4 | bool IsPrime(int num) {
5 | for (int i = 2; i <= sqrt(num); i++) {
6 | if (num % i == 0) return false;
7 | }
8 | return true;
9 | }
10 | int main() {
11 | int num = 0;
12 | cin >> num;
13 | if (IsPrime(num)) cout << "YES" << endl;
14 | else cout << "NO" << endl;
15 | return 0;
16 | }输入 97 时,输出为 `NO`。
正确答案错误
97 没有不超过 的整数因子,`IsPrime(97)` 返回 `true`,程序输出 `YES`。
输入 119 时,输出为 `YES`。
正确答案错误
,循环在 `i=7` 时找到因子并返回 `false`,程序输出 `NO`。
若将第 5 行的 `<=` 改成 `<`,程序输出不会改变。
正确答案错误
若把 `<=` 改为 `<`,完全平方数的平方根不会被试除。例如 49 将跳过因子 7,从而被误判为素数。
当程序执行第 8 行时,`i` 的值为 `sqrt(num)`。
正确答案错误
`i` 在第 5 行 `for` 初始化语句中定义,只在该循环内有效;执行第 8 行时已经不存在可访问的变量 `i`。
最坏情况下,此程序的时间复杂度是( )。
正确答案C
最坏情况下循环从 2 检查到 ,迭代次数与 同阶,因此复杂度为 。
若输入为 20 以内的正整数,则输出 `YES` 的概率是( )。
正确答案A
1 到 20 中有 8 个素数;该程序还会把 1 误判为素数,所以共有 9 个输入输出 `YES`,概率为 。
1 | #include <bits/stdc++.h>
2 | using namespace std;
3 | const int mod = 2048;
4 | long long c, n;
5 | long long kasumi(long long x, long long mi) {
6 | long long res = 1;
7 | while (mi) {
8 | if (mi & 1) {
9 | res = (res * x) % mod;
10 | }
11 | x = (x * x) % mod;
12 | mi >>= 1;
13 | }
14 | return res;
15 | }
16 | int main() {
17 | cin >> n >> c;
18 | if (n == 3) {
19 | printf("%lld", c * (c - 1));
20 | return 0;
21 | }
22 | long long ans = ((kasumi(c - 1, n) + (c - 1) * kasumi(-1, n)) % mod + mod) % mod;
23 | cout << ans << endl;
24 | return 0;
25 | }将第 9 行和第 11 行中的圆括号去掉,程序输出不变。
正确答案正确
去掉第 9、11 行乘法外层的括号后,表达式分别成为 `res * x % mod` 和 `x * x % mod`;乘法与取模同级且从左到右结合,结果不变。
将第 12 行的 `mi >>= 1` 改为 `mi *= 0.5`,程序输出不变。
正确答案正确
在题目预期的非负整数范围内,`mi >>= 1` 与整型变量执行 `mi *= 0.5` 都得到向下取整的 ,循环过程不变。
若输入 `4 4`,输出为 78。
正确答案错误
输入 `4 4` 时,,取模后仍为 84,并非 78。
此程序的时间复杂度为 。
正确答案正确
循环每次把指数 `mi` 折半,迭代次数为 ;主函数中的其余运算均为常数时间。
若输入 `3 4`,输出为( )。
正确答案B
输入 `3 4` 后满足 `n == 3`,直接输出 。
1 | #include <cstdio>
2 | int n, r, num[10000];
3 | bool mark[10000];
4 | void print() {
5 | for (int i = 1; i <= r; i++)
6 | printf("%d", num[i]);
7 | printf("\n");
8 | }
9 | void search(int x) {
10 | for (int i = 1; i <= n; i++)
11 | if (!mark[i]) {
12 | num[x] = i;
13 | mark[i] = true;
14 | if (x == r) print();
15 | search(x + 1);
16 | mark[i] = false;
17 | }
18 | }
19 | int main() {
20 | scanf("%d%d", &n, &r);
21 | search(1);
22 | }程序结束时,对任意 ,都有 `mark[i] = 0`。
正确答案正确
每次递归前把 `mark[i]` 设为 `true`,递归返回后又设回 `false`;所有调用结束时数组恢复到初始的全 0 状态。
若 ,则程序无输出。
正确答案正确
当 时,最多只能选出 个互不相同的数字,递归无法到达 `x == r` 的打印条件,因此没有输出。
若输入 `4 3`,则输出中数字 1 和 2 的个数不同。
正确答案错误
输入 `4 3` 会枚举所有 4 个数取 3 个的排列。由对称性,每个数字出现的总次数相同,所以数字 1 和 2 的个数相同。
此程序的时间复杂度为 。
正确答案错误
程序枚举长度为 的排列,输出规模为 ;当 时达到 量级,显然不是 。
若输入 `6 3`,则函数 `print` 的执行次数为( )。
正确答案B
输入 `6 3` 时会打印从 6 个数中依次取 3 个的所有排列,次数为 。
若输入 `7 4`,则输出的最后一行为( )。
正确答案B
每层循环都按 1 到 7 的顺序选择数字,因此输出按字典序递增;最大的 4 位排列是 `7654`。
(循环队列)使用长度为 的数组实现一个循环队列。约定队列最多保存 个元素,测试数据保证不会向满队列继续入队,也不会从空队列取元素。
1 | #include <iostream>
2 | using namespace std;
3 | const int N = 1005;
4 | int q[N], head = 0, tail = 0;
5 | bool empty() {
6 | return ①;
7 | }
8 | void push(int x) {
9 | ②;
10 | tail = (tail + 1) % N;
11 | }
12 | int front() {
13 | return ③;
14 | }
15 | void pop() {
16 | ④;
17 | }
18 | int main() {
19 | push(4);
20 | push(7);
21 | pop();
22 | push(9);
23 | cout << ⑤ << '\n';
24 | return 0;
25 | }① 处应填( )。
head == tailhead != tailhead == 0tail == N正确答案A
本实现用 `head==tail` 表示队列为空。
② 处应填( )。
q[head] = xq[tail] = xhead = xtail = x正确答案B
新元素写入当前队尾位置 `q[tail]`,再把 tail 循环后移。
③ 处应填( )。
q[tail]tailq[head]head正确答案C
head 指向当前队首元素,所以 `front()` 返回 `q[head]`。
④ 处应填( )。
tail = (tail + 1) % Nhead = (head + 1) % N--tailhead = tail正确答案B
出队删除队首元素,只需把 head 循环后移一格。
⑤ 处应填( )。
empty()tailq[tail]front()正确答案D
操作后队列为 7、9,输出队首应调用 `front()`,结果为 7。
(二维前缀和)给定一个 的整数矩阵,回答 次子矩形元素和查询。每次给出左上角 和右下角 ,坐标均从 1 开始。
1 | #include <iostream>
2 | using namespace std;
3 | long long a[505][505], s[505][505];
4 | int main() {
5 | int n, m, q;
6 | cin >> n >> m >> q;
7 | for (int i = 1; i <= ①; ++i) {
8 | for (int j = 1; j <= m; ++j) {
9 | cin >> a[i][j];
10 | s[i][j] = ②;
11 | }
12 | }
13 | while (③--) {
14 | int x1, y1, x2, y2;
15 | cin >> x1 >> y1 >> x2 >> y2;
16 | int up = ④;
17 | cout << ⑤ << '\n';
18 | }
19 | return 0;
20 | }① 处应填( )。
mnqn * m正确答案B
外层循环枚举矩阵的 n 行,因此条件上界应为 n。
② 处应填( )。
a[i][j] + s[i - 1][j] + s[i][j - 1] - s[i - 1][j - 1]a[i][j] + s[i - 1][j - 1]s[i - 1][j] + s[i][j - 1]a[i][j]正确答案A
当前前缀和等于当前元素加上上方和左方前缀,再减去被重复计算的左上前缀。
③ 处应填( )。
qnmn + m正确答案A
共有 q 次子矩形查询,因此使用 `while(q--)`。
④ 处应填( )。
x1 + 1x2 - 1x1 - 1x2 + 1正确答案C
查询矩形上方的前缀区域结束于第 `x1-1` 行,因此令 `up=x1-1`。
⑤ 处应填( )。
s[x2][y2]s[x2][y2] - s[up][y2]s[x2][y2] - s[up][y2] - s[x2][y1 - 1]s[x2][y2] - s[up][y2] - s[x2][y1 - 1] + s[up][y1 - 1]正确答案D
用大前缀减去上方和左方区域后,左上区域被减了两次,需要加回一次。