乐于分享
好东西不私藏

青少年信息素养大赛 C++ 真题完整版

青少年信息素养大赛 C++ 真题完整版

一、单项选择题(共 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 个连队上报的粮食数量。关于这段代码的运行情况,以下分析正确的是?

#include using namespace std;intmain() { int a[5] = {1020304050}; 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

满分代码

#include using 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

满分代码

#include using 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;}

解题核心:只解析存储字符与数量,不拼接超长字符串,取模定位,适配极限数据范围

考点:字符串解析、大数处理、循环取模、分段查找