
一、单项选择题(共 5 题)
第 1 题
突击队在过桥时遇到一个复杂的判断指令:
if (桥没断 && (没有敌人 || 我们有重火力))。
如果侦察兵发现 “桥已经断了”(第一个条件为假),C++ 程序会怎么做?A. 继续判断后面有没有敌人
B. 继续判断后面有没有重火力
C. 直接判定整个条件为假
D. 程序会报错崩溃
答案:C解析:&&逻辑与存在短路特性,左侧条件为假,整体结果必定为假,不再判断右侧内容。
考察知识点:逻辑运算符、短路求值、程序执行顺序
第 2 题
哨兵在潜伏时,需要记录前方道路是 “安全”(字符 'S')还是 “危险”(字符 'D')的状态。
下面哪种数据类型最适合用来存储这种状态?
A. int
B. double
C. bool
D. char
答案:D
解析:char专门存放单个字符,匹配本题存储 S、D 的需求。
考察知识点:基础数据类型选用
第 3 题
某部队将 10 袋小米平分给 3 个排,用 C++ 表达式10 % 3
计算剩下的小米袋数,得出结果是多少?
A. 1
B. 3
C. 30
D. 0
答案:A解析:%是取模运算符,求取除法余数,10÷3 余 1。
考察知识点:取模运算、余数实际应用
第 4 题
n名战士组成的队伍排成了一字长蛇阵,第一个人在最左,第n个人在最右,可类比为 C++ 数组。
要求在第k个战士的左边插入一名新来的向导,队伍总人数变为n+1。
为了保证队形不乱,一个位置同时只能站一个人,那么其他战士应该怎么有序移动调整队形,方便向导入队?
A. 从左到右,把第k个到第n个战士依次向右移一个位置
B. 从右到左,把第n个到第k个战士依次向右移一个位置
C. 不需要移动,直接把向导放在第k个位置即可
D. 从右到左,把第n个到第k+1个战士依次向右移一个位置
答案:B解析:数组插入元素必须从后往前移动元素,避免前方数据被提前覆盖丢失。
考察知识点:一维数组插入原理
第 5 题
在红军某部通讯系统中,0 代表原地整备。以下 C++ 表达式的值不为 0 的是?
A. 4 % 2
B. 15 - 3 * 5
C. 2 / 5
D. 10 / 3
答案:D
解析:A、B、C 运算结果均为 0,D 整数除法结果为 3。
考察知识点:运算优先级、整数除法、取模运算
二、多项选择题(共 5 题)
第 6 题
如下的代码可以计算行军速度(speed)。
distance代表里程,days代表行军天数。以下说法正确的是?
int distance = 5;int days = 2;double speed1 = distance / days;double speed2 = (double)distance / days;
A. speed1的值是 2.5
B. speed1的值小于speed2
C. speed2的值是 2.5
D. 比起speed2,speed1的结果更准确
答案:BC解析:两个 int 直接相除取整数部分,强制转换后得到浮点小数。
考察知识点:整数除法、强制类型转换
第 7 题
我们用for循环和while循环模拟红军的不同任务,下列理解正确的是?
A. for循环通常更适合用于 “已知任务天数” 的场景(循环次数已知,例如行军n天)
B. while循环通常更适合用于 “不知道要守几天,但只要大部队没到就一直坚守”(未知循环次数,但知道结束条件)的场景
C. for循环和while循环是可以互相等价替换的
D. while循环里不能潜伏隐藏(嵌套)for循环
答案:ABC解析:循环支持互相嵌套,D 选项错误。
考察知识点:两大循环特点、使用场景、循环嵌套
第 8 题
这一段代码用来统计 5 个连队上报的粮食数量。关于这段代码的运行情况,以下分析正确的是?
#includeusing namespace std;intmain() {int a[5] = {10, 20, 30, 40, 50};int sum = 0;for(int i = 1; i <= 4; i++) {sum += a[i];}cout << sum << endl;return 0;}
A. 这段代码最终的输出结果是 140
B. 这段代码最终的输出结果是 150
C. 这段代码不能够正确统计 5 个连队的粮食总和
D. 如果想要正确统计 5 个连队的粮食总和,必须把循环条件改成i <= 5
答案:AC解析:循环从下标 1 开始遍历,漏掉首个数据;i<=5 会造成数组越界。
考察知识点:数组下标、循环遍历、数组越界
第 9 题
红军情报小队正在研究质数(素数)相关的加密方法,以下关于质数的逻辑正确的是?
A. 2 是最小的质数
B. 不存在两个相邻(差为 1)的质数
C. 所有的奇数都是质数
D. “埃氏筛” 是一种可以高效找出一段范围内所有质数的算法
答案:AD解析:2 和 3 相差 1,B 错误;9、15 是奇数非质数,C 错误。
考察知识点:质数基础概念、筛法思想
第 10 题
下列符合 C++ 编程良好书写习惯的是
A. 代码语句末尾必须书写分号
B. 变量命名尽量通俗易懂
C. 循环嵌套层数越多代码越优秀
D. 重复代码尽量简化处理
答案:ABD解析:多层嵌套降低代码可读性,不属于好习惯。
考察知识点:编程规范与代码习惯
三、编程实战题(共 4 题)
编程题 1 筹备行军包
题目描述
红军即将踏上新的征程,后勤部的同志们正在紧急组装行军包。 目前后勤部仓库里共有 x 份干粮和 y 份弹药。根据指挥部的要求,每一个标准行军包中必须严格包含 a 份干粮和 b 份弹药,缺一不可。 请你编写一个程序,帮助后勤部计算一下,利用现有的物资,最多能组装出多少个完整的标准行军包?(多余的无法凑成一整包的物资不予计算)。
输入格式
输入共一行,包含四个正整数 x, y, a, b,数字之间用一个空格隔开。它们分别代表:干粮的总数、弹药的总数、一个行军包需要的干粮数、一个行军包需要的弹药数。
输出格式
输出共一行,包含一个整数,表示最多能组装出的完整行军包数量。
样例输入
10 10 2 3
样例输出
3
满分代码
#include#includeusing namespace std;intmain(){int x,y,a,b;cin>>x>>y>>a>>b;int t1=x/a;int t2=y/b;cout<<min(t1,t2);return 0;}
考点:整数除法、取最小值
编程题 2 取用军粮
题目描述
红军在大本营休整完毕,部队后勤部需要从大本营仓库中带走正好 N 斤的军粮,再启程出发。 仓库目前有两种规格的粮食:大袋青稞面(每袋 5 斤)和小袋黄米(每袋 3 斤)。 请你编写程序算一算:如果要刚好拿走 N 斤粮食,总共有多少种不同的搭配方案?(粮食必须整袋拿,不能拆开。允许某种粮食不拿,即袋数可以为 0)。数据保证有解。
输入格式
一个正整数 N,表示需要的粮食总斤数。
输出格式
一个整数,表示搭配方案的总数。
样例输入
15
样例输出
2
满分代码
#includeusing namespace std;intmain(){int n,cnt=0;cin>>n;for(int i=0;i*5<=n;i++){int res=n-i*5;if(res%3==0) cnt++;}cout<<cnt;return 0;}
考点:枚举循环、余数判断
编程题 3 壮大队伍
题目描述
初始有 1 名红军同志进入一个新的地区,在第一个月里发展了 x 名新同志加入组织。假设每一名新加入的同志,在下一个月都会各自去发展 x 名新同志加入(同时,老同志每个月也会继续发展 x 名新同志)。 按照这个规律,第 n 个月结束时该地区一共有多少名革命同志?
输入格式
共一行,包含两个正整数 x 和 n,中间用空格隔开。x 表示每人每月发展的新同志数量。n 表示发展的月数。
输出格式
一个整数,表示第 n 个月结束时该地区革命同志的总人数。
样例输入
2 3
样例输出
27
满分代码
#includeusing namespace std;intmain(){int x,n;cin>>x>>n;long long ans=1;for(int i=1;i<=n;i++){ans=ans*(1+x);}cout<<ans;return 0;}
考点:循环递推、long long 防大数溢出
编程题 4 夜行军的信号
题目描述
我们用大写字母组成的字符串表示红军原本的信号序列,s 是其 “压缩” 后的结果,压缩规则如下: 连续重复的字母,就把它们压缩成 “字母 + 连续出现的次数” 的形式。 例如:连续的 AAAA 压缩为 A4;连续的 BB 压缩为 B2。 如果某个字母只孤立地出现了一次(没有连续重复),不需要加数字,保留原样即可(例如 C 依然是 C,不写成 C1)。 例:s = "A4B2",则原本的信号序列字符串是 "AAAABB"。
通信兵按照原本的信号序列字符串发信号时,第 1 次打出第 1 个字母,第 2 次打出第 2 个字母…… 当打完最后一个字母后,通信兵又会立刻从头开始打第 1 个字母,如此循环往复。 请你帮他算一算:通信兵打出的第 n 个信号,对应哪个字母?
数据范围
压缩串长度小,展开后长度极大,直接拼接字符串会超时、内存溢出,只能拿到部分分数,必须使用分段统计写法拿满分。
输入格式
输入共 2 行: 第一行:包含一个仅由大写英文字母与数字组成的字符串 s(表示压缩后的信号序列) 第二行:一个正整数 n(表示需要查询的是第 n 个信号)
输出格式
输出共 1 行,一个大写英文字母。
样例输入输出
样例输入
ABC
4
样例输出
A
满分 AC 代码(考场满分专用)
using namespace std;struct Node{char ch;long long cnt;}p[1005];intmain(){string s;long long n;cin>>s>>n;int len=s.size();int i=0,top=0;while(i='0'&&s[i]<='9'){num=num*10+s[i]-'0';i++;}if(num==0) num=1;p[++top].ch=c;p[top].cnt=num;}long long sum=0;for(int j=1;j<=top;j++) sum+=p[j].cnt;long long pos=(n-1)%sum;long long now=0;char ans;for(int j=1;j<=top;j++){if(pos<now+p[j].cnt){ans=p[j].ch;break;}now+=p[j].cnt;}cout<<ans;return 0;}
解题核心:只解析存储字符与数量,不拼接超长字符串,取模定位,适配极限数据范围
考点:字符串解析、大数处理、循环取模、分段查找
夜雨聆风