CSP 2026入门组第一轮试题
该比赛已结束,您无法在比赛模式下递交该题目。您可以点击“在题库中打开”以普通模式查看和递交本题。
一、单项选择题(共 15 题,每题 2 分,共计 30 分;每题有且仅有一个正确选项)
- 下列 C++ 数据类型中,能够精确存储 这个整数的是( )。
{{ select(1) }}
floatlong longdoubleint
- 十六进制数 转换为八进制数是( )。
{{ select(2) }}
- 执行下列 C++ 代码,输出是( )。
int a = 7, b = 3;
std::cout << a / b * b + a % b;
{{ select(3) }}
- 初始时栈为空,将 依次入栈,入栈过程中允许随时出栈。下列出栈序列中不可能出现的是( )。
{{ select(4) }}
- 一棵有 个结点的完全二叉树,其中叶子结点个数是( )。
{{ select(5) }}
- 执行下列代码后
s的值是( )。
int s = 0;
for (int i = 1; i <= 100; i++)
if (i % 3 == 0 || i % 5 == 0)
s += i;
{{ select(6) }}
- 上楼梯每步可上 级、 级或 级,从地面(可视为第 级)走到第 级台阶共有多少种不同走法( )。
{{ select(7) }}
- 下图为 网格,行号、列号均从 开始,
#为障碍,.为可通行格:
S..#.
...#.
...#.
##..E
...#.
从 S 出发做广度优先搜索(BFS):初始时把 S 入队;每次取出队首格子,按“上、下、左、右”(上=行号减 ,下=行号加 ,左=列号减 ,右=列号加 )的顺序遍历它的四个相邻格子,越界、障碍或已访问的格子跳过,其余格子标记为已访问并入队。当 E 第一次入队时,已经入队过的格子(含 S 和 E)共有多少个( )。
{{ select(8) }}
- 满足 且 的正整数 共有多少个( )。
{{ select(9) }}
- 某国硬币面值为 元、 元、 元且数量不限,凑出 元最少需要多少枚( )。
{{ select(10) }}
- 执行下列代码,输出是( )。
int a[5] = {1, 3, 5, 7, 9};
int *p = a + 2;
*(p - 1) = p[0] + p[2];
p[1] = *(a + 1) - a[0];
cout << a[1] << "," << a[3];
{{ select(11) }}
14,138,1314,714,2
- 在含 个互不相同元素的升序数组中,用二分法查找给定值(返回元素位置或报告不存在),最坏情况下需要与数组元素比较多少次( )。
{{ select(12) }}
- 数组 的前缀和数组 (即 )满足 。则 的值是( )。
{{ select(13) }}
- 数轴上有 个点,坐标分别为 。在数轴上选取一个整数坐标点 ,使 到这 个点的距离之和最小,这个最小距离和是( )。
{{ select(14) }}
- 一个无向图有 个顶点,其中 个顶点的度为 ,其余顶点的度均为 ,则该图的边数是( )。
{{ select(15) }}
二、阅读程序(程序输入不超过数组或字符串定义的范围;判断题正确填 √,错误填 ×;除特殊说明外,判断题 1.5 分,选择题 3 分,共计 40 分)
(1)
#include <iostream>
using namespace std;
int main() {
int n;
cin >> n;
int x = 1, y = 1;
while (n > 0) {
if (n % 2 == 0) {
++x;
} else {
++x;
++y;
}
n = n / 2;
}
cout << x << ' ' << y << endl;
return 0;
}
以下问题均假定输入的 为不超过 的非负整数。
判断题
16.(1 分)当输入为 时,程序输出为 3 3。( )
{{ select(16) }}
- 正确
- 错误
- 将第 11 行的
++x;删除后,程序输出的两个数一定相等。( )
{{ select(17) }}
- 正确
- 错误
- 假设输入为非负整数,则程序输出的第一个数一定不小于第二个数。( )
{{ select(18) }}
- 正确
- 错误
单选题
- 将第 7 行的
while (n > 0)改为while (n >= 0)后,程序可能出现的问题是( )。
{{ select(19) }}
- 陷入死循环
- 输出结果比原来大
- 输出结果比原来小
- 输出结果不受影响
- 当输入为 时,输出为( )。
{{ select(20) }}
3 34 24 35 2
- 若输入 依次取遍 中的所有整数,则程序输出的第二个数恰好为 的次数为( )。
{{ select(21) }}
(2)
#include <algorithm>
#include <iostream>
#include <string>
using namespace std;
int a[100007], b[100007], c[100007], carry[100007];
string input_str;
int a_len, b_len;
int main() {
cin >> input_str;
a_len = input_str.size();
for (int i = 0; i < a_len; i++) {
a[i] = input_str[a_len - i - 1] - '0';
}
cin >> input_str;
b_len = input_str.size();
for (int i = 0; i < b_len; i++) {
b[i] = input_str[b_len - i - 1] - '0';
}
carry[0] = 0;
for (int i = 0; i < max(a_len, b_len) + 1; i++) {
c[i] = a[i] + b[i] + carry[i];
if (c[i] >= 10) {
carry[i + 1] = 1;
c[i] -= 10;
} else {
carry[i + 1] = 0;
}
}
for (int i = max(a_len, b_len); i >= 0; i--) {
cout << c[i];
}
cout << endl;
return 0;
}
本题输入的两个数均为非负整数,位数不超过 ,可能包含前导零。
判断题
- 当输入为
123 456时,程序输出为0579。( )
{{ select(22) }}
- 正确
- 错误
- 假设输入的两个数均不含前导零,则程序输出的结果也一定不会含有前导零。( )
{{ select(23) }}
- 正确
- 错误
- 将第 21 行改为
c[i] = a[i] + b[i];后,程序输出的结果一定比原来的结果小。( )
{{ select(24) }}
- 正确
- 错误
单选题
- 当输入为
12345 678时,输出为( )。
{{ select(25) }}
01292301302313023130230
- 将第 22 行的
if (c[i] >= 10)改为if (c[i] > 10)后,当输入为95 15时,输出为( )。
{{ select(26) }}
010101101401410
- 假设输入的两个数均为 位正整数(不含前导零),且它们的和小于 ,则程序输出的字符串一定满足( )。
{{ select(27) }}
- 第一个字符一定不为
'0' - 长度一定为
- 长度一定为 ,且第一个字符为
'0' - 长度可能为
(3)
#include <iostream>
using namespace std;
bool check_prime(int x) {
if (x <= 1) return false;
for (int i = 2; i * i <= x; i++) {
if (x % i == 0) return false;
}
return true;
}
int n;
void search_result(int x) {
if (!check_prime(x)) return;
if (x >= n) {
cout << x << endl;
return;
}
for (int i = 0; i <= 9; i++) {
search_result(x * 10 + i);
}
}
int main() {
cin >> n;
for (int i = 1; i <= 9; i++) search_result(i);
return 0;
}
判断题
- 当输入为 时,程序的输出共有 行。( )
{{ select(28) }}
- 正确
- 错误
- 若输入的 不大于 ,则程序的输出中一定包含 。( )
{{ select(29) }}
- 正确
- 错误
- 若输入的 大于 ,将第 17 行的
for (int i = 0; i <= 9; i++)改为for (int i = 1; i <= 9; i += 2)后,程序的输出结果一定不变。( )
{{ select(30) }}
- 正确
- 错误
单选题
- 当输入为 时,程序输出的第 行为( )。
{{ select(31) }}
- 下列关于该程序输出的说法中,正确的是( )。
{{ select(32) }}
- 输出的数一定按照从小到大的顺序排列
- 随着输入 的增大,输出的行数一定不会增加
- 输出的数的个位数字只可能是 或
- 输出的每个大于等于 的数,十进制下删去它的末位数字后得到的数一定是质数
- 当输入为 时,程序输出的行数为( )。
{{ select(33) }}
三、完善程序(单选题,每小题 3 分,共计 30 分)
(1)进制减半
给定 ,再给定一个 进制下的数 ,其各个数位上的数按照从高位到低位的顺序给出,请你将其转化为 进制,并同样按照从高位到低位的顺序输出。
输入的第一行依次为 和 的位数 ,接下来 个数 从高位到低位描述各个数位上的数。
数据满足 ,,;对于所有 ,。
以下程序按“逐位除以 ”的方法完成进制转换。请补全程序。
#include <iostream>
constexpr int N = 100005;
long long b[N];
int main() {
long long n, m, d;
std::cin >> n >> m >> d;
int len = 1;
for (int i = 0; i < d; i++) {
long long x;
std::cin >> x;
for (int j = len; j >= 1; j--)
b[j] = ①;
b[0] = ②;
len++;
for (int j = 0; j < len; j++)
if (b[j] >= n) {
b[j + 1] += ③;
b[j] = ④;
if (j + 1 == len) len++;
}
}
while (⑤) len--;
for (int i = len - 1; i >= 0; i--)
std::cout << b[i] << ' ';
return 0;
}
- ①处应填( )。
{{ select(34) }}
b[j] * nb[j] * mb[j - 1] * nb[j - 1] * m
- ②处应填( )。
{{ select(35) }}
x * nx0m
- ③处应填( )。
{{ select(36) }}
b[j] / mb[j] % nb[j] % mb[j] / n
- ④处应填( )。
{{ select(37) }}
b[j] / mb[j] % nb[j] % mb[j] / n
- ⑤处应填( )。
{{ select(38) }}
len > 0 && b[len - 1] == 0len > 0 && b[0] == 0len > 1 && b[len - 1] == 0len > 1 && b[0] == 0
(2)平衡分割
给定一个长度为 的字符串,其中每个字符都是一个十六进制数位。例如,字符串 016A 表示十进制下的四个数 。
现在请选择 个( 是你选定的数)切分位置 ,其中 ,且 。再令 ,。
对于每个 ,计算第 个数到第 个数的平均值,记作 。你的目标是使 中最大值与最小值之差尽可能小,并输出这个最小值。
其中 。输入字符串中的字符只可能是 0~9 或 A~F。本题假定字符采用 ASCII 编码。输出答案时保留小数点后 位。
以下程序通过递归枚举所有可能的连续分段方案。请补全程序。
#include <algorithm>
#include <iomanip>
#include <iostream>
using namespace std;
constexpr int N = 25;
int n;
char s[N];
double ans = 1e100;
int get_val(char c) { return ①; }
void split(int l, int cnt, double minb, double maxb) {
if (l > n) {
if (cnt == 0) return;
ans = min(ans, maxb - minb);
return;
}
int sum = 0;
for (②) {
sum += ③;
double nwb = ④;
split(⑤);
}
}
int main() {
cin >> n >> s + 1;
split(1, -1, 1e100, -1e100);
cout << fixed << setprecision(6) << ans;
return 0;
}
- ①处应填( )。
{{ select(39) }}
c <= '9' ? c - '0' : c - 'A' + 10c <= '9' ? c - '0' : c - 'A'c <= '9' ? c - '0' + 1 : c - 'A' + 10c <= '9' ? c - '0' : c - 'A' + 9
- ②处应填( )。
{{ select(40) }}
int r = l; r <= n; r++int r = l; r < n; r++int r = 1; r <= n; r++int r = l; r++ < n
- ③处应填( )。
{{ select(41) }}
get_val(s[r])get_val(s[r - 1])s[r - 1]s[r]
- ④处应填( )。
{{ select(42) }}
sum / (r - l + 1)1.0 * sum / (r - l + 1)1.0 * sum / (r - l)sum * 1.0 / n
- ⑤处应填( )。
{{ select(43) }}
r + 1, cnt + 1, min(minb, nwb), max(maxb, nwb)r, cnt + 1, minb, maxbr + 1, cnt, nwb, nwbr, cnt, min(minb, nwb), max(maxb, nwb)
- 状态
- 已结束
- 规则
- IOI
- 题目
- 2
- 开始于
- 2026-9-20 10:30
- 结束于
- 2026-9-27 10:30
- 持续时间
- 168 小时
- 主持人
- 参赛人数
- 5