C++ 一级等级考试真题解析
1 单选题(每题 2 分,共 30 分)
第 1 题
2026 年春节联欢晚会上一个武术表演节目《武 BOT》。节目中多个人形机器人会表演空翻,它们落地可能会有微微踉跄,但都会迅速调整姿态站稳,并适当移动来和前后左右的其他机器人保持原来队列。如果将机器人视作一个计算机系统,那么在该计算机系统中下面哪一项不能作为输入设备( )。
A. 检测重心的重力传感器 B. 预装的 AI 算法程序 C. 接收动作指令的遥控器 D. 拍摄其他机器人的摄像头
解析: 答案 B。传感器、键盘、鼠标、遥控器、游戏杆、摄像头、麦克风等是输入设备,屏幕、打印机等是输出设备。算法程序是软件不属于输入输出设备,所以 B 错误。故选 B。
第 2 题
小明学习编程有一段时间了,他想在图形环境下把当前目录(或文件夹)下的文本文件 20260314.txt 的名字改一下。他用鼠标左键点击选中该文件后,立即完成下面哪个操作后将处于输入新文件名的状态( ):
A. 单击右键并选择弹出菜单中的'重命名' B. 双击左键 C. 按功能键 F1 D. 按回车键
解析: 答案 A。修改文件名用'重命名',单击鼠标右键并选择弹出菜单中的'重命名'。双击左键是'打开'文件,按功能键 F1 一般是'帮助',按回车键也相当于双击左键是'打开'文件,所以 A 正确。故选 A。
第 3 题
下面 C++ 代码可以执行,有关说法正确的是( )。
double PI = 3.1415926;
cout << (PI);
A. 为了方便初学者,cout << (PI) 和 cout << (pi) 效果相同,即变量的大小写不敏感 B. cout << (PI) 修改为 cout << (Pi) 能正常执行 C. 不能用 PI 做变量名,因为要保存圆周率这个常量 D. 将程序中全部 PI 都改写为 Pai,将能正常执行,不会报错
解析: 答案 D。C++/C 变量名是大小写敏感的,即大小写是不同变量,因此 PI、Pi、pi 是三个不同的变量,故 A、B 错误,PI 符合 C++/C 变量名命名规则,可以赋常数,故 C 错误。变量名可以是 PI,也可以是 Pai,两者都符合 C++/C 变量名命名规则,所以 D 正确。故选 D。
第 4 题
C++ 表达式 3 * 3 % 2 的值为( )。
A. 81 B. 27 C. 4 D. 1
解析: 答案 D。C++/C 中'* / %'为同优先级运算符,计算从左向右计算,先算'3 * 3'得 9,运算符%为求余运算,再算'9 % 2'得 1,所以 D 正确。故选 D。
第 5 题
整型变量 a、b 的初值都是 4,则下面的 C++ 代码执行后的输出是( )。
a, b = 3, 4;
cout << (a + 2) << (b - 2) << endl;
cout << a << b << endl;
A.
- 61
- 43 B.
- 52
- 34 C.
- 62
- 44 D.
- 62
- 32
解析: 答案 A。C++/C 中'a, b = 3, 4;'为逗号表达式,这是将多个表达式分别求值,相当于: a; b = 3; 4; 只有被赋值,故 a=4,b=3,(a+2) 输出 6,(b-2) 输出 1,输出第一行为 61,第二行为 43,所以 A 正确。故选 A。
第 6 题
下面 C++ 代码的相关说法,正确的是( )。
int N = 0;
cin >> N;
cout << (N);
A. 执行时如输入 10,则将输出 10 B. 执行时如输入 3.14,将报错 C. 执行时如输入 ABC,将报错 D. 执行时如输入 -10,将报错
解析: 答案 A。输入 3.14,N 接收的是 3,不会出错;输入 ABC,N 没有接收数据,其值仍为 0,不会出错;输入 -10,N 接收的是 -10,不会出错。所以 A 正确。故选 A。
第 7 题
下面 C++ 代码执行时,其说法正确的是( )。
int M = 0, N = 0;
cin >> M;
cin >> N;
if (N > M)
cout << (N - M);
else
cout << (M - N);
A. 如果输入一个正数和一个负数,其输出结果肯定是大于 0 B. 不管是负整数、正整数亦或 0,其结果肯定是大于等于 0 C. 如果 N 和 M 是相等的整数,将不会有输出 D. 如果 N 和 M 输入带有小数点的数,将按整数部分计算
解析: 答案 B。选项 A 不完全正确,结果可能为 0;选项 B,包含 0,正确;选项 C,当 N=M 时,由 else 语句后的 cout 输出 0,错误;选项 D,当输入带有小数点的数时,整数部分被 M 接收,N 接收不到数据,仍为 0,故不是按整数部分计算,错误。故选 B。
第 8 题
下面 C++ 代码执行后的输出是( )。
int i, tnt = 1;
for (i = 0; i < 5; i++)
tnt *= i;
printf("%2d%2d\n", tnt, i);
A. 24 5 B. 10 5 C. 0 4 D. 0 5
解析: 答案 D。for 循环结束时 i=5(此时 i<5 不成立),因为当 i=0,tnt*i=0,故 tnt=0,所以输出为 0 5。故选 D。
第 9 题
执行下面 C++ 代码段求序列 -1+2+3-4+5+6-7+8+9-10+11+12...... 之值。例如输入 4,则计算序列前 4 项的值,规律如序列所示,输出为 0。下面说法中正确的是( )。
int N, tnt, i;
cout << "请输入正整数:";
cin >> N;
tnt = 0;
for (i = 1; i < N + 1; i++) // L1
if (i % 3 == 1) // L2
tnt += -i;
else
tnt += i;
cout << tnt;
A. L1 行中 i < N + 1 应该修为 i < N 才会符合预期 B. L2 行中 i % 3 == 1 应修改为 i % 3 == 0 才会符合预期 C. L2 行中 i % 3 == 1 修改为 i % 3 与当前程序效果相同 D. 当前代码能实现题目所描述计算目标
解析: 答案 D。因为 for 循环 i 从 1 开始,包含 N 项,所以条件是 i<=N,即 i<N+1,所以选项 A 错误;L2 行中 i % 3 == 1 应修改为 i % 3 == 0,则第 1 项为正,第 3 项为负,故错误;L2 行中 i % 3 == 1 修改为 i % 3,则相当于 i % 3!=0,第 1 项、第 2 项都为负,第 3 项为正,故错误;所以 D 正确。故选 D。
第 10 题
下面 C++ 代码的相关说法,正确的是( )。
int i;
for (i = 1; i < 10; i++){
if (i % 2 == 0){
continue; // L1
}
else
cout << i << "#";
}
cout << i << "END";
A. 上述代码执行后,其输出是 1#3#5#7#9#9END B. 删除 else 后的执行效果与当前代码相同 C. 删除 else 且将 cout << i << "#" 移入 L1 行下面,则执行效果与当前代码相同 D. 在 cout << i << "END" 前增加判断 if(i > 10),其执行效果与当前代码相同
解析: 答案 B。因为循环中遇到 continue 语句,就直接跳到下一循环,相当于跳过循环体中 continue 语句。所以对程序当 i 为偶数地不会有输出,循环结束时 i=10,最后会输出'10END',全部输出为'1#3#5#7#9#10END',选项 A 错误;删除 else 后,当 i 为奇数时仍能执行'cout << i << "#";',故效果与当前代码相同,选项 B 正确;删除 else 且将 cout << i << "#" 移入 L1 行下面,则'cout << i << "#";'永远不会被执行,只会输出'10END',选项 C 错误;在 cout << i << "END" 前增加判断 if(i > 10),因为此时 i=10,条件 i>10 不成立,'10END'不会输出,选项 D 错误。故选 B。
第 11 题
一个正整数的每位都是个位数,称为数位,最高位非 0。下面的 C++ 代码用于求正整数的所有数位之和,简称数位和。如 123 的各数位分别是 1、2、3,则其数位和为 1+2+3,结果为 6。为实现该目标,横线处应该填写的代码是( )。
int N;
cin >> N;
int tnt = 0;
while (N != 0){
____________;
____________;
}
cout << "N 的数位和为:" << tnt;
A.
- tnt += N / 10
- N /= 10 B.
- tnt += N % 10
- N /= 10 C.
- tnt += N / 10
- N %= 10 D.
- tnt = tnt + N % 10
- N %= 10
解析: 答案 B。要取各位数,可以用数%10 获得个位数,用数/10 去掉个位数,当数/10 为 0 时,数位已取完,结束。第 5 行数位和要加 N%10,填 tnt=tnt+N%10,第 6 行修正 N,填 N=N/10,与选项 B 一致。故选 B。
第 12 题
小明想要快速知道任给一个正整数中有多少个奇数位 (数位值是奇数),下面的 C++ 代码是其实现,横线处应该填入的代码是( )。
int N;
cin >> N;
int odd_count = 0; // 记录奇数的个数
int old_number = N; // 保存原数
while (N != 0){
if (_________________)
odd_count += 1;
N = (N - N % 10) / 10;
}
cout << old_number << "中共有 " << odd_count << " 个奇数";
A. N % 10 % 2 == 0 B. N % 10 % 2 == 1 C. N / 10 / 2 == 1 D. N / 2 / 10 == 0
解析: 答案 B。要取各位数,可以用数%10 获得个位数,用数/10 去掉个位数,等价 (数 - 数%10)/10。所以横线处要填取个位数,即 N%10 能不被 2 整除,不能整除为奇数,或余数为 1 为奇数,所以横线处应填 N%10%2==1。故选 B。
第 13 题
小明和弟弟在玩一个拼数字游戏,游戏规则是:二人各写一个两位正整数 M 和 N;然后将较大的数字放在较小的前面,拼成一个 4 位数;将这个 4 位数除以 3 的余数添加到 4 位数的后面,得到一个 5 位数;最后判断这个 5 位数能否被 14 整除。下面的 C++ 代码用于判断 M 和 N 是否符合全部要求,如果符合则输出 Y 否则输出 N。例如输入 85 和 79,可以拼出 85792,恰好是 14 的倍数,则输出 Y。关于下面代码描述正确的是( )。
int M, N, Q;
cin >> M >> N;
if(M > N) // L1
Q = M*100+N;
else
Q = N*100+M;
if((Q*10+Q%3) % 14 == 0) // L2
cout << "Y";
else
cout << "N";
A. 代码段不能完成正确判断 B. L1 行代码中条件应该改为 M <= N C. L2 行代码应该改为 if ((Q*10+Q/3) % 14 == 0) D. 代码段可以不使用变量 Q,而是在区分 M 和 N 大小后分别直接用它们来判断
解析: 答案 D。所给代码能完成正确判断,选项 A 错误;L1 行代码中条件应该改为 M <= N,不影响结果,选项 B 不正确;Q/3 为求除以 3 的商,而不是除以 3 的余数,选项 C 错误;代码中确实可以不使用变量 Q,而是在区分 M 和 N 大小后分别直接用它们来判断,但程序会复杂一些。故选 D。
第 14 题
执行下面 C++ 代码可以判断一个 6 位正整数 N 的高 3 位和低 3 位的差是否是 314 的倍数。例如 628314 就符合要求。横线处应该填入( )。
cin >> N;
if (___________________________)
cout << N << "符合条件" << endl;
A. ((N % 1000) - (N / 1000)) / 314 == 0 B. ((N / 1000) - (N % 1000)) % 314 == 0 C. ((N % 1000) - (N / 1000)) / 314 D. ((N / 1000) - (N % 1000)) % 314
解析: 答案 B。求 6 位正整数 N 的高 3 位为 N/1000,低 3 位为 N%1000,6 位正整数 N 的高 3 位和低 3 位的差是 (N/1000- N%1000), 314 的倍数为%314==0。故选 B。
第 15 题
N 是一个正整数。如果 N 的所有奇数位的数位和等于所有偶数位的数位和,则称它是一个'双螺旋数'。例如 12375 的所有奇数位的数位和是 9,同时它的所有偶数位的数位和也是 9,则 12375 就是一个双螺旋数。下面的 C++ 代码用于判断输入的 N 是否为双螺旋数。空白处应该填入的代码是( )。
int i, N, N1=0, N2=0, N0;
cin >> N;
N0 = N;
while (N){
_________________________
_________________________
}
if(N1 == N2)
cout << N0 << "是双螺旋数" << endl;
A.
- N1 += N%10, N /= 10;
- N2 += N%10, N /= 10; C.
- N1 += N/10, N /= 10;
- N2 += N/10, N /= 10; C.
- N1 += N%10, N %= 10;
- N2 += N%10, N %= 10; D.
- N1 += N/10, N %= 10;
- N2 += N/10, N %= 10;
解析: 答案 A。数位和,每次 + 数%N,数/10 调整数。所以从个位开始数的奇数位和为 N1 += N%10, N /= 10;,此时 N 已去掉个位,从个位开始数的偶数位和为 N2 += N%10, N /= 10;,如 N 为奇数位,则最后一轮计算,求出 N1 之后 N=0,所以 N2+0,值保持不变。所以选项 A 正确。故选 A。
2 判断题(每题 2 分,共 20 分)
第 1 题
小明的妈妈最近刚刚给他买了一块电话手表,除了可以看时间,小明也可以用它和妈妈打电话、收发信息,那么可以推测这块手表中装有一款特定操作系统。
解析: 答案正确 (√)。可以看时间、打电话和收发信息的电话手表,属智能手表,需要安装智能手表操作系统。故正确。
第 2 题
C++ 表达式 4 % 2 和 2 * 2 % 2 的结果相同。
解析: 答案正确 (√)。C++ 的'* / %'三个运算符优先级相同,计算顺序为从左向右。4 % 2=0,2 * 2 % 2=4%2=0,结果相同。故正确。
第 3 题
下面 C++ 代码段成功执行后将输出 0。
for (i = 1; i < 10; i++)
if (i % 3 == 0)
break;
cout << i;
解析: 答案错误 (×)。C++ 的 break 为终止本循环,跳出循环体,执行循环体后的语句。不题当循环到 i=3 时,i%3==0 成立,跳出循环执行 cout << i; 输出 3。故错误。
第 4 题
下面能够正常执行的 C++ 代码段用于求 1 到 N 之和,N 为正整数。因为 i < N + 1,所以是 1 到 N 且包含 N 之和。
tnt = 0;
cout << "请输入正整数:";
cin >> N;
total = 0;
for (i =1; i < N + 1; i++) ;
total += i;
cout << total;
解析: 答案错误 (×)。因为第 5 行后有分号 (;),所以循环体为空,total += i; 并不是循环体,循环结束后 i=N+1,输出结果为 N+1 而不是 1 到 N 之和。故错误。
第 5 题
执行下面的 C++ 代码段,其语句 cout << (N) 将被执行 0 次或无数次(即死循环)。
cin >> N;
while (N)
cout << (N);
解析: 答案正确 (√)。如果输入为 0,则不会执行循环体 (语句 cout << (N) 将被执行 0 次);如果输入为非 0,则因为 N 不会变化,循环条件永远为真,会无数次执行循环体 (即死循环)。故正确。
第 6 题
下面的 C++ 代码段的变量都是整型,它能用于判断输入的正整数是否为对称数。所谓对称数是指从左到右和从右到左读该数,其值相同。例如,121 和 414 都是对称数,而 123 不是对称数。( )
cout << "请输入正整数:";
cin >> n;
old_number = n;
new_number = 0;
while (n != 0){
new_number = new_number * 10 + n % 10;
n /= 10;
}
if (old_number == new_number)
cout << "对称数";
else
cout << "非对称数";
解析: 答案正确 (√)。第 7 行为从个位开始,从右向左'组装'一个新数据,即生成一个原数据 old_number 倒过来的新数据 new_number,如两数据相等,则原数据对称 (也称'回文')。故正确。
第 7 题
执行下面的 C++ 代码段,如果变量都为整型变量,输入为大于 0 的整数,则输出数值一定为 -N 的值。
cin >> N;
total = 0;
for (i = -N; i < N; i +=2)
total += i;
cout << total;
解析: 答案正确 (√)。如 N>0 且为整数,则第 3 行、第 4 行的结果相当于: -N-(N-1)+(N-2)-...-2-1+0+1+2+...+(N-2) +(N-1)=-N 故正确。
第 8 题
执行 C++ 语句 printf("%d\n", 3.14) 将报错。
解析: 答案错误 (×)。在 C++ 中,printf("%d\n", 3.14) 的行为属于未定义行为(undefined behavior),原因是:①%d 是用于输出有符号十进制整数的格式说明符,期望接收一个 int 类型的参数。②但实际传入的是 3.14,这是一个 double 类型的字面量 (C++ 中浮点数常量默认为 double 类型)。③printf 是变参函数,不会对参数进行隐式类型转换,因此会将 3.14 的二进制表示 (按 double 存储) 错误地解释为 int,导致输出结果不可预测,但不会报错。故错误。
第 9 题
执行下面的 C++ 代码后将输出 2500。
int cnt = 0;
for (int i = 1; i < 100; i++)
cnt += i++;
cout << cnt;
解析: 答案正确 (√)。如 N>0 且为整数,则第 2 行、第 3 行的结果相当于: 1+3+5+7+...+97+99=(1+99)*50/2=2500 故正确。
第 10 题
小明在测试 C++ 的 printf 的功能时执行了 printf("%-5d\n", 314),则代码输出的结果是 -5314。
解析: 答案错误 (×)。在 C++ 中,printf("%-5d\n", 314) 的输出结果是: 314 (即数字 314 后跟两个空格,共占 5 个字符宽度)。 格式说明符 %-5d 的含义: -:表示左对齐 (默认是右对齐)。 %d:以十进制整数形式输出。 5:指定最小输出宽度为 5 个字符,不足默认补空格。 数字 314 占 3 个字符,因此需要补充 2 个空格,使其总宽度达到 5。左对齐意味着空格补在数字右边。故错误。
3 编程题(每题 25 分,共 50 分)
3.1 编程题 1
- 试题名称:交朋友
- 时间限制:1.0 s
- 内存限制:512.0 MB
3.1.1 题目描述
Alice 班上共有 4 个小朋友,身高分别为 H₁, H₂, H₃, H₄,其中 Alice 的身高为 H₁。 Alice 想要和身高最接近她的人交朋友,如果有多个人符合条件,则 Alice 想和其中较矮的那一人做朋友,你能告诉她这个人的身高是多少吗?
3.1.2 输入格式
输入共 4 行,第 i 行包含一个整数 Hᵢ,表示班上小朋友的身高。
3.1.3 输出格式
输出 1 行,包含一个整数 h,表示 Alice 想交的朋友的身高。
3.1.4 样例
输入样例: 150 165 135 140
输出样例: 135
3.1.5 样例解释
样例 1 中,Alice 身高为 150,第 2、3 个小朋友与 Alice 身高差距为 15,同样最接近,Alice 选较矮的一个即第 3 个 身高为 135 的小朋友交朋友。
3.1.6 数据范围
保证 100≤Hᵢ≤199 且 Hᵢ互不相同。
3.1.7 编写程序
解析: 由于是一级,没有数组知识点要求,所以不能用数组进行循环判断,好在数据少可以用顺序一个一个判。由于 Alice 的身高为 H₁,所以只需 H₂、H₃、H₄与 H₁的差作三次判断。
方法一: 思路:按题意设计逻辑。 设身高差 d= H₂‒H₁,Alice 的朋友 frd=H₂,则只需再判两次。若 H₃‒H₁<d,则 frd=H₃,若相等则 d 为 d 与 H₃取小者;若 H₄‒H₁<d,则 frd=H₄,若相等则 d 为 d 与 H₄取小者。参考代码如下:
#include <iostream>
using namespace std;
int main() {
int h1, h2, h3, h4, d, frd;
cin >> h1 >> h2 >> h3 >> h4;
if (h2 - h1 > 0)
d = h2 - h1;
else
d = h1 - h2;
frd = h2;
if (h3 - h1 > 0) {
if (h3 - h1 == d) {
if (h3 < frd) frd = h3;
} else if (h3 - h1 < d)
frd = h3, d = h3 - h1;
} else if (h1 - h3 == d) {
if (h3 < frd) frd = h3;
} else if (h1 - h3 < d)
frd = h3, d = h1 - h3;
if (h4 - h1 > 0) {
if (h4 - h1 == d) {
if (h4 < frd) frd = h4;
} else if (h4 - h1 < d)
frd = h4;
} else if (h1 - h4 == d) {
if (h4 < frd) frd = h4;
} else if (h1 - h4 < d)
frd = h4;
cout << frd << endl;
return 0;
}
方法二: 思路:方法一中,对某同学身高需多处改变 frd 为同一值,如在判 h3 时有两个条件都要修改 frd 为 h3,判 h4 时有两个条件都要修改 frd 为 h4,逻辑没有合并,由于 hᵢ可能小于 h1,又作了一条件判断,两部分的代码是类似的 (主要是差值的正负)。增加变量 dist 作为最小距离,即方法一中的 d,d 作为本次距离,即 hᵢ-h1。方法二将两种需修改朋友身高的条件合并,不直接用 hᵢ-h1 判断,改用 d=hᵢ-h1,用 d 判断,简化方法一。完整简化代码如下:
#include <iostream>
using namespace std;
int main() {
int h1, h2, h3, h4, d, frd, dist;
cin >> h1 >> h2 >> h3 >> h4;
dist = h2 - h1;
if (dist < 0) dist = -dist;
frd = h2; // 对 h2, 朋友只能是 h2
d = h3 - h1;
if (d < 0) d = -d;
if (d < dist || (d == dist && h3 < frd)) frd = h3, dist = d; // 对 h3 如比 h2 更符合题意,修改朋友,修改身高差
d = h4 - h1;
if (d < 0) d = -d;
if (d < dist || (d == dist && h4 < frd)) frd = h4; // 对 h4 如比 h2、h3 更符合题意,修改朋友,最后一位不用修改身高差
cout << frd << endl;
return 0;
}
3.2 编程题 2
- 试题名称:数字替换
- 时间限制:1.0 s
- 内存限制:512.0 MB
3.2.1 题目描述
Alice 不喜欢数字 4,但觉得数字 8 寓意好,她想把数中的 4 全都替换成 8,若数中不含 4 则无需修改,你能帮帮她吗?
3.2.2 输入格式
输入一行,包含一个整数 A,表示替换前的数。
3.2.3 输出格式
输出一行,包含一个整数 B,表示替换后的数。
3.2.4 样例
输入样例 #1: 8459045
输出样例 #1: 8859085
输入样例 #2: 123
输出样例 #2: 123
3.2.5 样例解释
对于样例 1,输入 8459045 中有两个 4,都将其替换为了 8,得到 8859085。对于样例 2,输入 123 中不包含 4,无需修改输入数字,输出 123。
3.2.6 数据范围
0≤A≤10⁸。
3.2.7 编写程序
解析: 由于要取数字的每一位,用字符数组或字符串做是最方便的,但一级题,只能用一级知识点来做。设 N 为要处理的数,则 N%10 为个位的数 (除以 10 的余数),N/10 为去掉个位数后剩下的数。
如图 1 所示,一个五位数 54321,每一位都有一个权值,个位为 1,十位为 10,百位为 100,千位为 1000,万位为 10000,从个位 1 开始每向左一位权值增加 10 倍,所以 54321 可以表示为 510000+41000+3100+210+1=(((5*10+4)*10+3)*10+2)*10+1=54321。
方法一: 思路:设 A 为原数字,B 为修改后的数字,r 为权值,则 现在需要从原数 A 中取出每一位,可用 d=A%10 取出个位 1 位,然后调整 A=A/10(去掉个位),取出的位如是 4 要修改为 8(if (d=4) d=8;),要重新组装为修改后的 B,B=B+rd; r=r10; (注:B 的初值为 0,r 的初值为 1)。 可参考单选题第 11 题、第 12 题和判断题第 6 题。注意本题与判断题第 6 题的区别:判断题第 6 题是反转 (颠倒) 次序,故用 B=B10+d; ,权值乘在组装的数 B 上;本题次序不变,故要用 B=B+rd; r=r*10; ,权值乘在数位 d 上。完整参考代码如下:
#include <iostream>
using namespace std;
int main() {
int A = 0, B = 0, d, r = 1; // A≤10⁸, int 足够
cin >> A;
while (A > 0) {
d = A % 10;
if (d == 4) d = 8;
B += r * d;
A /= 10;
r *= 10;
}
cout << B << endl;
return 0;
}
方法二: 思路:用字符数组做,如下标 i 对应的元素难为'4',直接修改该下标元素为'8',然后输出该元素。本方法需三级知识点。参考代码如下:
#include <iostream>
using namespace std;
char A[9]; // A≤10⁸, 最多 9 位
int main() {
cin >> A;
int n = sizeof(A);
for (int i = 0; i < n; i++) {
if (A[i] == '4') A[i] = '8';
cout << A[i];
}
return 0;
}


