2026年全国青少年信息素养大赛算法应用主题赛C++赛项【决赛】模拟卷4:文末附答案
一、单选题(共5题,每题2分,共10分)
1.红军某部正在编制密码通信系统,需要定义一个变量存储"电报密文长度"(最大不超过100000)。以下定义最合适的是( )。
A.short length;
B.int length;
C.double length;
D.char length;
2.以下关于C++数组的说法,错误的是( )。
A. 数组下标从0开始
B. 数组名可以看作指向数组首元素的指针
C. 定义数组时,数组长度可以是变量
D. 可以用循环遍历数组中的所有元素
3.红军战士要判断一个整数n是否"吉利数"——既能被7整除(代表7连),又不能被13整除。正确的条件表达式是( )。
A.n % 7 == 0 && n % 13 != 0
B.n % 7 == 0 || n % 13 != 0
C.n / 7 == 0 && n / 13 != 0
D.n % 7 == 0 && n % 13 == 0
4.以下程序段执行后,输出结果是( )。
intsum=0;for(inti=1;i<=10;i++){if(i%3==0)continue;sum+=i;}cout<<sum;A. 55
B. 37
C. 45
D. 40
5.红军通信员编写了一个函数用于计算行军总里程:
intdistance(intspeed,intdays){returnspeed*days;}若调用distance(35, 4),返回值为( )。
A. 39
B. 140
C. 120
D. 135
二、多选题(共5题,每题4分,共20分。)
6.下列C++变量名中,合法的有( )。
A._RedArmy
B.2ndDivision
C.soldier_count
D.int
7.关于break和continue语句,下列说法正确的有( )。
A.break用于跳出当前循环或switch语句
B.continue用于结束本次循环,进入下一次迭代
C. 在嵌套循环中,break只跳出最内层循环
D.continue可以用于switch语句中
8.以下关于C++函数的说法,正确的有( )。
A. 函数可以没有返回值(void类型)
B. 函数可以没有参数
C. 函数可以在另一个函数内部定义
D. 函数可以递归调用自身
9.要统计一段文本(含大小写字母、数字、标点)中英文字母的个数,需要用到哪些C++知识?( )
A. 字符数组或string类型
B. 循环遍历
C. 条件判断(判断字符是否为字母)
D. 指针运算
10.以下关于C++常量的定义,语法正确的有( )。
A.const int MAX = 1000;
B.#define MAX 1000
C.const int MAX; MAX = 1000;
D.#define MAX 1000;
三、编程操作题(共4题,第11、12题各15分,第13、14题各20分,共70分)
第1题(15分)——口令验证
红军哨兵使用口令系统验证身份。系统预设正确口令为"红星闪耀"。哨兵连续输入口令,若输入正确则输出"通过"并结束程序;若输入错误则提示"口令错误,请重试",允许重新输入。若连续错误达到3次,则输出"警报!"并结束程序。
输入格式:若干行字符串,每行为一次输入的口令。
输出格式:根据情况输出对应信息,每次输出占一行。
样例输入1:
红星闪耀样例输出1:
通过样例输入2:
错误口令 错误口令 红星闪耀样例输出2:
口令错误,请重试 口令错误,请重试 通过样例输入3:
错误口令 错误口令 错误口令样例输出3:
口令错误,请重试 口令错误,请重试 口令错误,请重试 警报!第2题(15分)——弹药统计
红军某连队有3个排,每个排有若干名战士。请统计全连的总弹药数。
输入格式:
- 第一行一个整数
n(1 ≤ n ≤ 100),表示排的数量。 - 接下来
n行,每行第一个整数m(1 ≤ m ≤ 50)表示该排的战士人数,后面跟着m个整数,表示每名战士持有的弹药数(0 ≤ 弹药数 ≤ 100)。
输出格式:一个整数,表示全连的总弹药数。
样例输入:
3 4 5 3 8 6 3 2 7 4 2 9 1样例输出:
45解释:第1排:5+3+8+6=22;第2排:2+7+4=13;第3排:9+1=10;总计45。
第3题(20分)——长征路上的质数哨站
红军在长征途中每隔一段距离设立一个哨站。哨站编号从1到n。指挥部决定:只有质数编号的哨站才安排瞭望员。请输出所有需要安排瞭望员的哨站编号。
输入格式:一个整数n(2 ≤ n ≤ 10000)。
输出格式:一行,按从小到大输出所有质数编号,用空格分隔。
样例输入:
20样例输出:
2 3 5 7 11 13 17 19第4题(20分)——军粮分配
红军某部有n名战士(编号1~n)依次排队领取军粮。仓库中有m袋粮食,每袋粮食的重量存储在数组w中。分配规则如下:
- 战士按编号从小到大依次领取;
- 每位战士领取当前剩余粮食中最重的一袋;
- 若当前剩余粮食袋数少于剩余战士人数,则剩余的每位战士各领取1袋(按从重到轻依次分配),分配结束。
请模拟该分配过程,输出每位战士最终分到的粮食重量。
输入格式:
- 第一行两个整数
n和m(1 ≤ n ≤ 1000,1 ≤ m ≤ 1000),分别表示战士人数和粮食袋数。 - 第二行
m个整数,表示每袋粮食的重量(1 ≤ 重量 ≤ 10000)。
输出格式:一行,n个整数,用空格分隔,表示第1到第n位战士分到的粮食重量。
样例输入1:
3 5 10 20 30 40 50样例输出1:
50 40 30解释:3位战士,5袋粮食。第1位取最重的50,第2位取40,第3位取30。剩余2袋(20和10)不再分配(因为战士已全部领完)。
样例输入2:
5 3 100 50 80样例输出2:
100 80 50 0 0解释:5位战士,3袋粮食。第1位取100,第2位取80,第3位取50。剩余两位战士没有粮食可领,输出0。
样例输入3:
2 2 15 25样例输出3:
25 15参考答案与解析
一、单选题
第1题:【答案】B
解析:密文长度最大10000,short通常为16位,范围约-32768~32767,虽然能存下10000但不够安全规范;int是整型首选,范围足够;double是浮点型,不适合存储整数长度;char只能存储单个字符。应选int。
第2题:【答案】C
解析:A正确,数组下标从0开始;B正确,数组名代表首地址;C错误,C++中定义数组时长度必须是常量表达式,不能用变量(除非使用动态数组或vector);D正确,数组可以配合循环遍历。
第3题:【答案】A
解析:题目要求"能被7整除且不能被13整除"。A选项n % 7 == 0 && n % 13 != 0完全符合;B选项用||(或)错误;C选项用除法判断整除错误(应用%取模)。D选项n % 7 == 0 && n % 13 == 0能被7整除且能被13整除,错误。
第4题:【答案】B
解析:循环i从1到10,遇到i % 3 == 0(即i=3,6,9)时执行continue跳过累加。实际累加的是1+2+4+5+7+8+10 = 37。
第5题:【答案】B
解析:函数distance(int speed, int days)返回speed * days。调用distance(35, 4)即35×4=140。
二、多选题
第6题:【答案】A、C
解析:C++变量名(标识符)由字母、数字、下划线组成,不能以数字开头,不能是关键字。A_RedArmy(下划线开头,合法);B2ndDivision(数字开头,不合法);Csoldier_count(合法);Dint(关键字,不合法)。
第7题:【答案】A、B、C
解析:A正确,break跳出当前循环或switch;B正确,continue结束本次循环进入下一次;C正确,嵌套循环中break只跳出最内层;D错误,continue只能用于循环语句(for、while、do-while),不能用于switch。
第8题:【答案】A、B、D
解析:A正确,函数可以无返回值(void);B正确,函数可以无参数;C错误,C++不允许函数嵌套定义(在一个函数内部定义另一个函数);D正确,函数可以递归调用。
第9题:【答案】A、B、C
解析:统计文本中字母个数,需要:用字符数组或string存储文本(A);用循环遍历每个字符(B);用条件判断字符是否为字母(c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z')(C)。指针运算非必需(D)。
第10题:【答案】A、B
解析:A正确,const常量定义时初始化;B正确,#define宏定义常量;C错误,const常量必须在定义时初始化,不能先声明后赋值;D错误,#define宏定义不加分号(加分号会导致宏展开时多一个分号,可能引发语法错误)。
三、编程操作题
编程题第1题
思路分析
本题模拟口令验证流程,核心是循环计数。
- 使用一个变量
fail记录连续错误次数,初始为 0。 - 用
while或for无限循环,每次读入一个字符串。 - 若等于正确口令
"红星闪耀",立即输出"通过"并结束程序。 - 否则输出错误提示,
fail++;当fail == 3时输出"警报!"并结束。
代码实现
#include<bits/stdc++.h>usingnamespacestd;intmain(){intfail=0;//失败次数string s;//输入的口令while(true){//无限循环cin>>s;//读入口令if(s=="红星闪耀"){//正确cout<<"通过"<<endl;//输出通过return0;//结束程序}else{//错误cout<<"口令错误,请重试"<<endl;//提示重试fail++;//错误次数加1if(fail==3){//达到三次cout<<"警报!"<<endl;//输出警报return0;//结束程序}}}return0;}编程题第2题
思路分析
本题只需逐行累加弹药总数。
- 先读入排数
n,用变量sum存储总弹药数,初始为 0。 - 对每个排,先读入战士人数
m,然后循环m次读入每名战士的弹药数,累加到sum。 - 所有排处理完后输出
sum。
代码实现
#include<bits/stdc++.h>usingnamespacestd;intmain(){intn;//排数cin>>n;intsum=0;//总弹药数for(inti=1;i<=n;i++){//遍历每个排intm;//该排战士人数cin>>m;for(intj=1;j<=m;j++){//遍历每位战士intx;//弹药数cin>>x;sum+=x;//累加}}cout<<sum<<endl;//输出总弹药数return0;}编程题第3题
思路分析
本题需判断 2 到 n 之间的每个数是否为质数。
- 质数定义:大于 1 且只能被 1 和自身整除。
- 判断方法:对每个数 x,从 2 试除到 sqrt(x),若存在因子则非质数。
- 优化:只需检查 i*i <= x,避免浮点运算。
- 依次判断并输出,每个质数后跟一个空格,最后换行。
代码实现
#include<bits/stdc++.h>usingnamespacestd;boolisPrime(intx){//判断x是否为质数if(x<2)returnfalse;//小于2不是质数for(inti=2;i*i<=x;i++){//试除到sqrt(x)if(x%i==0)returnfalse;//有因子则不是质数}returntrue;//是质数}intmain(){intn;cin>>n;for(inti=2;i<=n;i++){//从2开始检查if(isPrime(i)){//若是质数cout<<i<<" ";//输出并加空格}}cout<<endl;//换行return0;}编程题第4题
思路分析
本题核心是排序 + 模拟分配。
- 将粮食重量按从大到小排序。
- 每位战士依次取当前最重的一袋,即排序后的前若干袋。
- 实际能分到粮食的人数为
min(n, m):若粮食多于战士,前 n 位战士各得一袋,剩余粮食作废;若战士多于粮食,前 m 位战士各得一袋,后面的战士得 0。 - 用数组
ans存储每位战士的分配结果,初始为 0,将排序后的前t个重量赋给ans[1]到ans[t],最后依次输出。
代码实现
#include<bits/stdc++.h>usingnamespacestd;intmain(){intn,m;cin>>n>>m;inta[1010];//粮食重量for(inti=1;i<=m;i++){cin>>a[i];}sort(a+1,a+m+1,greater<int>());//从大到小排序intans[1010]={0};//每位战士分到的粮食,初始0intt=min(n,m);//实际能分到粮食的人数for(inti=1;i<=t;i++){ans[i]=a[i];//前t位战士各取一袋}for(inti=1;i<=n;i++){cout<<ans[i]<<" ";//输出}cout<<endl;return0;}关注老师的专栏,查看完整版全国青少年信息素养大赛C++备赛资料(初赛+复赛):
https://blog.csdn.net/weixin_66461496/category_12969975.html
相关课程《全国青少年信息素养大赛C++初赛真题试卷及答案解析》(视频课)
https://www.bilibili.com/cheese/play/ss447406764
相关课程《全国青少年信息素养大赛C++复赛真题试卷及答案解析》(视频课)
https://www.bilibili.com/cheese/play/ep2532538
各种学习资料,助力大家一站式学习和提升!!!
#include<bits/stdc++.h>usingnamespacestd;intmain(){cout<<"########## 一站式掌握信奥赛知识! ##########";cout<<"############# 冲刺信奥赛拿奖! #############";cout<<"###### 课程购买后永久学习,不受限制! ######";return0;}【秘籍汇总】(完整csp信奥赛C++学习资料):
1、csp/信奥赛C++,完整信奥赛系列课程(永久学习):
https://edu.csdn.net/lecturer/7901 点击跳转
2、CSP信奥赛C++竞赛拿奖视频课:
https://edu.csdn.net/course/detail/40437 点击跳转
https://edu.csdn.net/course/detail/41081 点击跳转
3、csp信奥赛高频考点知识详解及案例实践:
CSP信奥赛C++动态规划:
https://blog.csdn.net/weixin_66461496/category_13096895.html点击跳转
CSP信奥赛C++标准模板库STL:
https://blog.csdn.net/weixin_66461496/category_13108077.html 点击跳转
信奥赛C++提高组csp-s知识详解及案例实践:
https://blog.csdn.net/weixin_66461496/category_13113932.html 点击跳转
4、csp信奥赛冲刺一等奖有效刷题题解:
信奥赛C++普及组CSP-J一等奖通关刷题题单及题解:
https://blog.csdn.net/weixin_66461496/category_12673810.html 点击跳转
信奥赛C++普及组csp-j初赛&复赛真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12808781.html 点击跳转
信奥赛C++提高组csp-s初赛&复赛真题题解(持续更新):
https://blog.csdn.net/weixin_66461496/category_13125089.html 点击跳转
5、GESP C++考级真题题解:
GESP(C++ 一级+二级+三级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12858102.html 点击跳转
GESP(C++ 四级+五级+六级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12869848.html 点击跳转
GESP(C++ 七级+八级)真题题解(持续更新):
https://blog.csdn.net/weixin_66461496/category_13117178.html 点击跳转
· 文末祝福 ·
#include<bits/stdc++.h>usingnamespacestd;intmain(){cout<<"跟着王老师一起学习信奥赛C++";cout<<" 成就更好的自己! ";cout<<" csp信奥赛一等奖属于你! ";return0;}