2026全国青少年信息素养大赛复赛模拟题
C++ 4-6年级组
考试时间:90分钟 | 总分:120分 | 编程语言:C++
注意事项
请将答案通过标准输入输出(cin/cout)提交 每题需独立编写完整程序 程序运行时间限制:1秒 内存限制:256MB
第一题:文具店购物
分值:10分 | 难度:★★☆
题目描述
小明去文具店买文具,钢笔每支 8 元,圆珠笔每支 3 元,橡皮每个 2 元。
已知小明买了 a 支钢笔、b 支圆珠笔、c 个橡皮,请计算他需要支付的总金额。
输入格式
三个整数 a、b、c,分别表示购买的钢笔、圆珠笔、橡皮的数量,之间用空格分隔。
输出格式
一个整数,表示需要支付的总金额。
样例输入
3 5 4样例输出
47数据范围
0 ≤ a, b, c ≤ 100
知识点
顺序结构、基本运算
第二题:成绩等级判断
分值:15分 | 难度:★★☆
题目描述
根据学生的考试分数,判断该学生的成绩等级:
90 分及以上:输出 A80 分及以上:输出 B70 分及以上:输出 C60 分及以上:输出 D60 分以下:输出 E
输入格式
一个整数 score,表示学生的考试成绩。
输出格式
输出一个字符,表示成绩等级。
样例输入
85样例输出
B数据范围
0 ≤ score ≤ 100
知识点
if-else 分支结构
第三题:数组元素统计
分值:20分 | 难度:★★★
题目描述
给定一个包含 n 个整数的一维数组,统计数组中:
正数的个数 负数的个数 零的个数 所有正数的和
输入格式
第一行一个整数 n(1 ≤ n ≤ 100),表示数组长度。第二行 n 个整数,表示数组元素。
输出格式
四个整数,分别表示正数个数、负数个数、零的个数、正数之和,之间用空格分隔。
样例输入
7-3 0 5 2 -1 0 8
样例输出
3 2 2 15数据范围
1 ≤ n ≤ 100 -1000 ≤ 数组元素 ≤ 1000
知识点
一维数组、循环、条件统计
第四题:完数判定
分值:25分 | 难度:★★★
题目描述
如果一个自然数恰好等于它的所有真因子(即不包括它本身的因子)之和,则称这个数为"完数"。
例如,6 的真因子有 1、2、3,且 1+2+3=6,所以 6 是完数。
请判断输入的整数 n(1 ≤ n ≤ 10000)是否为完数。如果是,输出 yes,否则输出 no。
输入格式
一个整数 n。
输出格式
如果是完数输出 yes,否则输出 no。
样例输入
6样例输出
yes样例说明
6 的真因子之和为 1+2+3=6,所以是完数。
数据范围
1 ≤ n ≤ 10000
知识点
数位分离思想(本题为因子枚举)、循环
第五题:矩阵对角线求和
分值:25分 | 难度:★★★★
题目描述
给定一个 n×n 的方阵,分别计算主对角线和副对角线上所有元素的和并输出。
主对角线:从左上到右下(行列下标相同) 副对角线:从右上到左下
输入格式
第一行一个整数 n(2 ≤ n ≤ 20),表示矩阵大小。接下来 n 行,每行 n 个整数,表示矩阵元素。
输出格式
两个整数,分别表示主对角线元素之和、副对角线元素之和,之间用空格分隔。
样例输入
31 2 34 5 67 8 9
样例输出
15 15样例说明
主对角线:1+5+9=15,副对角线:3+5+7=15。
数据范围
2 ≤ n ≤ 20 -100 ≤ 矩阵元素 ≤ 100
知识点
二维数组、循环、对角线性质
第六题:排队打水
分值:25分 | 难度:★★★★
题目描述
有 n 个人需要排队打水,第 i 个人的打水时间为 ti 秒。按照排队顺序,打水时间越长的人排在越后面越好(因为这样总等待时间更短)。
请找出最优的排队顺序,使得所有人的总等待时间最小。
总等待时间 = 第1个人等待时间 + 第2个人等待时间 + ... + 第n个人的等待时间其中第 i 个人需要等待前 i-1 个人的打水时间之和。
输出最小总等待时间。
输入格式
第一行一个整数 n(1 ≤ n ≤ 100)。第二行 n 个整数 t1, t2, ..., tn,表示每个人的打水时间。
输出格式
一个整数,表示最小总等待时间。
样例输入
53 6 4 2 5
样例输出
30样例说明
最优顺序(升序排列):2, 3, 4, 5, 6
第1人等待:0秒 第2人等待:2秒 第3人等待:2+3=5秒 第4人等待:2+3+4=9秒 第5人等待:2+3+4+5=14秒 最小总等待时间 = 0+2+5+9+14 = 30秒
数据范围
1 ≤ n ≤ 100 1 ≤ ti ≤ 1000
知识点
贪心算法、一维数组排序
参考答案
第一题:文具店购物
解题思路:直接根据单价和数量计算总金额:总金额 = 钢笔数×8 + 圆珠笔数×3 + 橡皮数×2。
参考答案代码:
#include<iostream>using namespace std;intmain(){int a, b, c;cin >> a >> b >> c;int total = a * 8 + b * 3 + c * 2;cout << total << endl;return 0;}
样例验证:
输入:3 5 4 计算:3×8 + 5×3 + 4×2 = 24 + 15 + 8 = 47 输出47 ✓
第二题:成绩等级判断
解题思路:使用 if-else 分支从高到低判断分数所在的等级区间,符合条件即输出对应等级。
参考答案代码:
#include <iostream>using namespace std;int main() {int score;cin >> score;if (score >= 90) {cout << ”A” << endl;} else if (score >= 80) {cout << ”B” << endl;} else if (score >= 70) {cout << ”C” << endl;} else if (score >= 60) {cout << ”D” << endl;} else {cout << ”E” << endl;}return 0;}
样例验证:
输入:85 判断:85 < 90,85 < 80? 否 → 85 >= 80? 是 → 输出 B ✓
第三题:数组元素统计
解题思路:遍历数组中的每个元素,根据其正负性分别统计正数个数、负数个数、零的个数,同时累加所有正数的和。
参考答案代码:
#include<iostream>using namespace std;intmain(){int n;cin >> n;int posCount = 0, negCount = 0, zeroCount = 0, posSum = 0;for (int i = 0; i < n; i++) {int x;cin >> x;if (x > 0) {posCount++;posSum += x;} else if (x < 0) {negCount++;} else {zeroCount++;}}cout << posCount << ” ” << negCount << ” ” << zeroCount << ” ” << posSum << endl;return 0;}
样例验证:
输入:7, -3 0 5 2 -1 0 8 正数:5,2,8 → 3个,和=15 ✓ 负数:-3,-1 → 2个 ✓ 零:0,0 → 2个 ✓ 输出:3 2 2 15 ✓
第四题:完数判定
解题思路:枚举 1 到 n/2 的所有整数,能整除 n 的即为真因子,累加所有真因子后与 n 比较。
参考答案代码:
#include<iostream>using namespace std;// 判断是否为完数boolisPerfect(int n){int sum = 0;for (int i = 1; i <= n / 2; i++) {if (n % i == 0) {sum += i;}}return sum == n;}intmain(){int n;cin >> n;if (isPerfect(n)) {cout << ”yes” << endl;} else {cout << ”no” << endl;}return 0;}
样例验证:
输入:6 真因子:1,2,3(6/2=3,1~3遍历) 1+2+3=6,等于n → 输出 yes ✓ 扩展验证:输入28(完数),真因子1,2,4,7,14,和=28 → yes
第五题:矩阵对角线求和
解题思路:主对角线下标为 (i,i),副对角线下标为 (i,n-1-i)。遍历时分别累加主对角线和副对角线的元素之和。
参考答案代码:
#include<iostream>using namespace std;intmain(){int n;cin >> n;int a[20][20];for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {cin >> a[i][j];}}int primary = 0, secondary = 0;for (int i = 0; i < n; i++) {primary += a[i][i];secondary += a[i][n - 1 - i];}cout << primary << ” ” << secondary << endl;return 0;}
样例验证:
输入:3, 矩阵[[1,2,3],[4,5,6],[7,8,9]] 主对角线:a[0][0]+a[1][1]+a[2][2] = 1+5+9 = 15 ✓ 副对角线:a[0][2]+a[1][1]+a[2][0] = 3+5+7 = 15 ✓ 输出:15 15 ✓
第六题:排队打水
解题思路:根据贪心策略,打水时间短的人排在前面总等待时间最小。将打水时间升序排列后,计算前缀和之和即可得到最小总等待时间。
参考答案代码:
#include<iostream>#include<algorithm>using namespace std;intmain(){int n;cin >> n;int t[100];for (int i = 0; i < n; i++) {cin >> t[i];}// 贪心策略:打水时间升序排列sort(t, t + n);// 计算总等待时间long long total = 0;long long prefix = 0; // 前缀和for (int i = 0; i < n; i++) {// 第i个人等待前i个人的打水时间(即前缀和)total += prefix;prefix += t[i];}cout << total << endl;return 0;}
样例验证:
输入:n=5, t=[3,6,4,2,5] 排序后:[2,3,4,5,6] 第1人:等待0,前缀和变为2 第2人:等待2,前缀和变为5 第3人:等待5,前缀和变为9 第4人:等待9,前缀和变为14 第5人:等待14,前缀和变为20 总等待时间 = 0+2+5+9+14 = 30 ✓
评分标准
为了让大家沟通交流更高效,对少儿编程课程、比赛、考级感兴趣的家长或老师,可以扫码进群
为了群内的高效沟通,减少噪音信息,我把每个群的人数设为20人左右

夜雨聆风