2026年全国青少年信息素养大赛算法应用主题赛C++赛项【决赛】模拟卷4:文末附答案
2026/8/5 12:18:14 网站建设 项目流程

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.关于breakcontinue语句,下列说法正确的有( )。

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. 战士按编号从小到大依次领取;
  2. 每位战士领取当前剩余粮食中最重的一袋
  3. 若当前剩余粮食袋数少于剩余战士人数,则剩余的每位战士各领取1袋(按从重到轻依次分配),分配结束。

请模拟该分配过程,输出每位战士最终分到的粮食重量。

输入格式:

  • 第一行两个整数nm(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。
  • whilefor无限循环,每次读入一个字符串。
  • 若等于正确口令"红星闪耀",立即输出"通过"并结束程序。
  • 否则输出错误提示,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;}

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询