#11175. 2026 CSP-J1 入门级第一轮 C++ 语言试题
2026 CSP-J1 入门级第一轮 C++ 语言试题
2026 CSP-J1 入门级第一轮 C++ 语言试题
认证时间:2026 年 9 月 19 日 09:30–11:30
考生注意事项
- 答题纸共有 1 页,满分 100 分。请在答题纸上作答,写在试题纸上的一律无效。
- 不得使用任何电子设备(如计算器、手机、电子词典、电子手表等)或查阅任何书籍资料。
一、单项选择题
共 15 题,每题 2 分,共计 30 分;每题有且仅有一个正确选项。
第 1 题
下列 C++ 数据类型中,能够精确存储 这个整数的是( ) {{ select(1) }}
- float
- long long
- double
- int
第 2 题
十六进制数 2F5 转换为八进制数是( ) {{ select(2) }}
- 1364
- 1635
- 1405
- 1365
第 3 题
执行下列 C++ 代码,输出是( )
int a = 7, b = 3;
std::cout << a / b * b + a % b;
{{ select(3) }}
- 9
- 10
- 7
- 6
第 4 题
初始时栈为空,将 1、2、3、4 依次入栈,入栈过程中允许随时出栈。下列出栈序列中不可能出现的是( ) {{ select(4) }}
- 2, 4, 3, 1
- 1, 2, 3, 4
- 3, 1, 2, 4
- 1, 4, 3, 2
第 5 题
一棵有 100 个结点的完全二叉树,其叶子结点个数是( ) {{ select(5) }}
- 49
- 50
- 64
- 51
第 6 题
执行下列代码后 s 的值是( )
int s = 0;
for (int i = 1; i <= 100; i++)
if (i % 3 == 0 || i % 5 == 0)
s += i;
{{ select(6) }}
- 3048
- 2733
- 2318
- 2418
第 7 题
上楼梯每步可上 1 级、2 级或 3 级,从地面(视为第 0 级)走到第 8 级台阶共有多少种不同走法( ) {{ select(7) }}
- 44
- 121
- 149
- 81
第 8 题
下图为 5×5 网格,行号、列号均从 0 开始,# 为障碍,. 为可通行格:
S..#.
...#.
...#.
##..E
...#.
从 S 出发做广度优先搜索(BFS):初始时把 S 入队;每次取出队首格子,按「上、下、左、右」(上 = 行号减 1,下 = 行号加 1,左 = 列号减 1,右 = 列号加 1)的顺序遍历它的四个相邻格子,越界、障碍或已访问的格子跳过,其余格子标记为已访问并入队。当 E 第一次入队时,已经入队过的格子(含 S 和 E)共有多少个( ) {{ select(8) }}
- 15
- 12
- 14
- 13
第 9 题
满足 且 的正整数 共有多少个( ) {{ select(9) }}
- 8
- 6
- 4
- 5
第 10 题
某国硬币面值为 1 元、4 元、6 元且数量不限,凑出 9 元最少需要多少枚( ) {{ select(10) }}
- 3
- 4
- 5
- 2
第 11 题
执行下列代码,输出是( )
int a[] = {1, 3, 5, 7, 9};
int *p = a + 2;
*(p - 1) = p[0] + p[2];
a[2] = *(a + 1) - a[0];
cout << a[1] << "," << a[2];
{{ select(11) }}
- 14,13
- 8,13
- 14,7
- 14,2
第 12 题
在含 1000 个互不相同元素的升序数组中,用二分法查找给定值(返回元素位置或报告不存在),最坏情况下需要与数组元素比较多少次( ) {{ select(12) }}
- 500
- 9
- 11
- 10
第 13 题
数组 a[1…n] 的前缀和数组 s(即 )满足 。则 a[10] 的值是( ) {{ select(13) }}
- 252
- 310
- 58
- 61
第 14 题
数轴上有 7 个点,坐标分别为 1、3、4、7、10、15、20。在数轴上选取一个整数坐标点 P,使 P 到这 7 个点的距离之和最小,这个最小距离和是( ) {{ select(14) }}
- 37
- 42
- 40
- 38
第 15 题
一个无向图有 10 个顶点,其中 4 个顶点的度为 3,其余顶点的度均为 4,则该图的边数是( ) {{ select(15) }}
- 36
- 18
- 17
- 20
二、阅读程序
程序输入不超过数组或字符串定义的范围;判断题正确填 ,错误填 ;除特殊说明外,判断题 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;
}
以下问题均假定输入的 n 为不超过 的非负整数。
判断题
第 16 题(1 分)当输入为 3 时,程序输出为 3 3。( )
{{ select(16) }}
- 正确
- 错误
第 17 题 将第 11 行的 ++x; 删除后,程序输出的两个数一定相等。( )
{{ select(17) }}
- 正确
- 错误
第 18 题 假设输入为非负整数,则程序输出的第一个数一定不小于第二个数。( ) {{ select(18) }}
- 正确
- 错误
单选题
第 19 题 将第 7 行的 while (n > 0) 改为 while (n >= 0) 后,程序可能出现的问题是( )
{{ select(19) }}
- 陷入死循环
- 输出结果比原来大
- 输出结果比原来小
- 输出结果不受影响
第 20 题 当输入为 6 时,输出为( ) {{ select(20) }}
- 3 3
- 4 2
- 4 3
- 5 2
第 21 题 若输入 n 依次取遍 0, 1, 2, …, 中的所有整数,则程序输出的第二个数恰好为 2 的次数为( ) {{ select(21) }}
- 16
- 30
- 31
- 32
(2)
#include <iostream>
#include <string>
#include <algorithm>
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 - 1 - i] - '0';
}
cin >> input_str;
b_len = input_str.size();
for (int i = 0; i < b_len; i++) {
b[i] = input_str[b_len - 1 - i] - '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;
}
本题输入的两个数均为非负整数,位数不超过 100000,可能包含前导零。
判断题
第 22 题 当输入为 123 456 时,程序输出为 0579。( )
{{ select(22) }}
- 正确
- 错误
第 23 题 假设输入的两个数均不含前导零,则程序输出的结果也一定不会含有前导零。( ) {{ select(23) }}
- 正确
- 错误
第 24 题 将第 21 行改为 c[i] = a[i] + b[i]; 后,程序输出的结果一定比原来的结果小。( )
{{ select(24) }}
- 正确
- 错误
单选题
第 25 题 当输入为 12345 678 时,输出为( )
{{ select(25) }}
- 012923
- 013023
- 13023
- 130230
第 26 题 将第 22 行的 if (c[i] >= 10) 改为 if (c[i] > 10) 后,当输入为 95 15 时,输出为( )
{{ select(26) }}
- 01010
- 110
- 140
- 1410
第 27 题 假设输入的两个数均为 n 位正整数(不含前导零),且它们的和小于 ,则程序输出的字符串一定满足( ) {{ select(27) }}
- 第一个字符一定不为
'0' - 长度一定为 n
- 长度一定为 n+1,且第一个字符为
'0' - 长度可能为 n+2
(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;
}
判断题
第 28 题 当输入为 10 时,程序的输出共有 10 行。( ) {{ select(28) }}
- 正确
- 错误
第 29 题 若输入的 n 不大于 5,则程序的输出中一定包含 5。( ) {{ select(29) }}
- 正确
- 错误
第 30 题 若输入的 n 大于 10,将第 17 行的 for (int i = 0; i <= 9; i++) 改为 for (int i = 1; i <= 9; i += 2) 后,程序的输出结果一定不变。( )
{{ select(30) }}
- 正确
- 错误
单选题
第 31 题 当输入为 24 时,程序输出的第 3 行为( ) {{ select(31) }}
- 23
- 29
- 31
- 239
第 32 题 下列关于该程序输出的说法中,正确的是( ) {{ select(32) }}
- 输出的数一定按照从小到大的顺序排列
- 随着输入 n 的增大,输出的行数一定不会增加
- 输出的数的个位数字只能是 3 或 7
- 输出的每个大于等于 10 的数,十进制下删去它的末位数字后得到的数一定是质数
第 33 题 当输入为 200 时,程序输出的行数为( ) {{ select(33) }}
- 12
- 13
- 14
- 15
三、完善程序
单选题,每小题 3 分,共计 30 分。
(1)进制减半
给定 n、m,再给定一个 进制下的数 A,其各个数位上的数按照从高位到低位的顺序给出。请你将其转化为 n 进制,并同样按照从高位到低位的顺序输出。
输入的第一行依次为 n、m 和 A 的位数 d,接下来 d 个数 从高位到低位描述各个数位上的数。
数据满足 ,,。
以下程序逐位读入数位,用「前缀 + 新数位」维护当前值,并在每步之后把各数位「逢 n 进一」归一化。请补全程序。
#include <iostream>
constexpr int N = 100005;
long long b[N];
int main() {
long long n, m, d;
std::cin >> n >> m >> d;
int len = 0;
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] = ④;
}
}
}
while ( ⑤ ) len--;
for (int i = len - 1; i >= 0; i--)
std::cout << b[i];
return 0;
}
第 34 题 ① 处应填( ) {{ select(34) }}
- b[j - 1] * m
- b[j - 1] * n
- b[j] * m
- b[j] * n
第 35 题 ② 处应填( ) {{ select(35) }}
- 0
- x
- x % n
- x / n
第 36 题 ③ 处应填( ) {{ select(36) }}
- b[j] % n
- b[j] / n
- b[j] * n
- b[j] - n
第 37 题 ④ 处应填( ) {{ select(37) }}
- b[j] / n
- b[j] % n
- b[j] - n
- b[j] + n
第 38 题 ⑤ 处应填( ) {{ select(38) }}
- len > 0
- len > 0 && b[len - 1] == 0
- len > 1 && b[len - 1] == 0
- b[len - 1] == 0
(2)平衡分割
给定一个长度为 n 的字符串,其中每个字符都是一个十六进制数位。例如字符串 016A 表示十进制下的四个数 0、1、6、10。
现请选择若干个切分位置,把它划分成若干连续段。对每段分别计算其所有数位的平均值。你的目标是使这些平均值中最大值与最小值之差尽可能小,并输出这个最小差值。
输入字符串中的字符只可能是 '0'—'9' 或 'A'—'F',本题假定字符采用 ASCII 编码。输出答案时保留小数点后 6 位。
以下程序通过递归枚举所有可能的连续分段方案。请补全程序。
#include <iostream>
#include <iomanip>
using namespace std;
constexpr int N = 25;
int n, a[N];
char s[N];
double ans = 1e100;
int value(char c) {
return ①;
}
void split(int l, int cnt, double mnb, double mxb) {
if (l > n) {
if (cnt == 0) return;
ans = min(ans, mxb - mnb);
return;
}
int sum = 0;
for (②) {
sum += a[r];
double nwb = ③;
split(④);
}
}
int main() {
cin >> n >> s + 1;
for (int i = 1; i <= n; ++i)
a[i] = value(s[i]);
split(⑤);
cout << fixed << setprecision(6) << ans;
return 0;
}
第 39 题 ① 处应填( ) {{ select(39) }}
- c - '0'
- c - (c < 'A' ? '0' : 'A' - 10)
- c - 'A' + 10
- c >= 'A' ? c - 'A' + 10 : c - '0'
第 40 题 ② 处应填( ) {{ select(40) }}
- int r = l; r <= n; r++
- int r = l + 1; r <= n; r++
- int r = 1; r <= n; r++
- int r = l; r <= n; ++r
第 41 题 ③ 处应填( ) {{ select(41) }}
- sum / (r - l + 1)
- sum * 1.0 / (r - l)
- sum * 1.0 / (r - l + 1)
- (double)sum / (r - l)
第 42 题 ④ 处应填( ) {{ select(42) }}
- r + 1, cnt + (r < n), min(mnb, nwb), max(mxb, nwb)
- r, cnt + 1, min(mnb, nwb), max(mxb, nwb)
- r + 1, cnt, min(mnb, nwb), max(mxb, nwb)
- r + 1, cnt + (r < n), nwb, nwb
第 43 题 ⑤ 处应填( ) {{ select(43) }}
- 1, 0, 1e100, -1e100
- 1, 1, 1e100, -1e100
- 1, 0, 0, 1e100
- 0, 0, 1e100, -1e100