夜雨聆风学习资料网

ARTICLE · 1040091

2026 CSP-J1 第一轮真题参考答案及解析

2026 CSP-J1 第一轮真题参考答案及解析

纪丹名师工作室 · 初中信息科技

2026 CSP-J1 第一轮真题参考答案及解析

入门级 · 43 题全解

认证时间 2026 年 9 月 19 日 09:30~11:30 | 试题纸 13 页 | 满分 100 分

本篇整理全部 43 题的参考答案与分步解析,含单项选择题 15 题、阅读程序 3 大题(18 题)、完善程序 2 大题(10 题)。试题 PDF 可在原文左下角「阅读原文」获取。

【来源于网络,仅供参考】如与官方答案有出入,请以官方发布为准。

为便于对照,下文所有程序代码均由原卷截图转录为文本,可选中、可复制;公式以上标、下标形式重排,便于在手机上直接阅读。每道题按题干、选项、参考答案、分步解析、考点五层呈现。

一、单项选择题

共 15 题,每题 2 分,共 30 分。每题有且仅有一个正确选项。

第 1 题 · C++ 数据类型范围与精度

下列 C++ 数据类型中,能够精确存储 1018 + 1 这个整数的是( )。

A. floatB. long longC. doubleD. int

参考答案 B

int:32 位,范围约 −2.1×109 ~ 2.1×109,无法存储 1018

float:32 位单精度浮点数,有效数字约 7 位,无法精确表示 1018+1。

double:64 位双精度浮点数,有效数字约 15~16 位,1018 有 19 位十进制,会丢失精度。

long long:64 位有符号整数,范围约 −9.2×1018 ~ 9.2×1018,可精确存储 1018+1。

考点 C++ 数据类型范围与精度。

第 2 题 · 进制转换

十六进制数 2F5 转换为八进制数是( )。

A. 1364B. 1635C. 1405D. 1365

参考答案 D

十六进制 2F5 转十进制:2×162 + 15×161 + 5×160 = 512 + 240 + 5 = 757

十进制 757 转八进制,反复除 8 取余:

757 ÷ 8 = 94 余 594 ÷ 8 = 11 余 611 ÷ 8 = 1 余 31 ÷ 8 = 0 余 1

逆序排列得:13658

考点 进制转换。

第 3 题 · C++ 整数除法与取模运算

执行下列 C++ 代码,输出是( )。

int a = 7, b = 3; std::cout << a / b * b + a % b;

A. 9B. 10C. 7D. 6

参考答案 C

a / b = 7 / 3 = 2(整数除法,截断小数)a / b * b = 2 * 3 = 6a % b = 7 % 3 = 16 + 1 = 7

考点 C++ 整数除法与取模运算。

第 4 题 · 栈的入栈与出栈顺序

初始时栈为空,将 1、2、3、4 依次入栈,入栈过程中允许随时出栈。下列出栈序列中不可能出现的是( )。

A. 2, 4, 3, 1B. 1, 2, 3, 4C. 3, 1, 2, 4D. 1, 4, 3, 2

参考答案 C

逐一模拟各选项出栈序列是否合法:

A(2,4,3,1):1 入,2 入,2 出;3 入,4 入,4 出;3 出;1 出。合法。

B(1,2,3,4):1 入,1 出;2 入,2 出;3 入,3 出;4 入,4 出。合法。

C(3,1,2,4):要第一个出 3,则 1、2、3 需依次入栈,然后 3 出。此时栈顶是 2,而下一个要出 1,但栈顶是 2,1 无法直接弹出。非法。

D(1,4,3,2):1 入,1 出;2 入,3 入,4 入,4 出;3 出;2 出。合法。

考点 栈的入栈与出栈顺序合法性判断。

第 5 题 · 完全二叉树的性质

一棵有 100 个结点的完全二叉树,其中叶子结点个数是( )。

A. 49B. 50C. 64D. 51

参考答案 B

完全二叉树中,若总结点数 n = 100:

最后一个非叶子结点的下标为 ⌊n/2⌋ = ⌊100/2⌋ = 50

叶子结点下标范围为 51, 52, …, 100

叶子结点个数 = 100 − 50 = 50

考点 完全二叉树的性质及其叶子结点的计算。

第 6 题 · 容斥原理与循环累加

执行下列代码后 s 的值是( )。

int s = 0; for (int i = 1; i <= 100; i++)     if (i % 3 == 0 || i % 5 == 0)         s += i;

A. 3048B. 2733C. 2318D. 2418

参考答案 D

统计 1~100 中所有能被 3 或 5 整除的数的和。

被 3 整除的和:3+6+…+99 = 3×(1+2+…+33) = 3×(33×34)/2 = 3×561 = 1683

被 5 整除的和:5+10+…+100 = 5×(1+2+…+20) = 5×(20×21)/2 = 5×210 = 1050

被 15 整除的和(重复计算):15+30+…+90 = 15×(1+2+…+6) = 15×(6×7)/2 = 15×21 = 315

容斥原理:1683 + 1050 − 315 = 2418

考点 容斥原理、循环累加。

第 7 题 · 递推算法(三步爬楼梯)

上楼梯每步可上 1 级、2 级或 3 级,从地面(可视为第 0 级)走到第 8 级台阶共有多少种不同走法( )。

A. 44B. 121C. 149D. 81

参考答案 D

设 f(n) 表示走到第 n 级的走法数。

边界条件:f(0) = 1,f(1) = 1,f(2) = 2(1+1 或 2)

递推公式:f(n) = f(n−1) + f(n−2) + f(n−3)(最后一步可以是 1 级、2 级或 3 级)

f(3) = f(2) + f(1) + f(0) = 2 + 1 + 1 = 4f(4) = f(3) + f(2) + f(1) = 4 + 2 + 1 = 7f(5) = f(4) + f(3) + f(2) = 7 + 4 + 2 = 13f(6) = f(5) + f(4) + f(3) = 13 + 7 + 4 = 24f(7) = f(6) + f(5) + f(4) = 24 + 13 + 7 = 44f(8) = f(7) + f(6) + f(5) = 44 + 24 + 13 = 81

考点 递推算法,斐波那契类问题。

第 8 题 · 广度优先搜索的模拟

下图为 5×5 网格,行号、列号均从 0 开始,# 为障碍,. 为可通行格:

S . . # . . . . # . . . . # . . . . . E . . . # .

从 S 出发做广度优先搜索(BFS):初始时把 S 入队;每次取出队首格子,按“上、下、左、右”(上即行号减 1,下即行号加 1,左即列号减 1,右即列号加 1)的顺序遍历它的四个相邻格子,越界、障碍或已访问的格子跳过,其余格子标记为已访问并入队。当 E 第一次入队时,已经入队过的格子(含 S 和 E)共有多少个( )。

A. 15B. 12C. 14D. 13

参考答案 C

S 在 (0,0),E 在 (3,4)。BFS 逐层模拟:

第 1 层(起点 S)

已入队 {(0,0)},共 1 个弹出 (0,0):下 (1,0) 入队,右 (0,1) 入队已入队 {(0,0), (1,0), (0,1)},共 3 个

第 2 层

弹出 (1,0):下 (2,0) 入队,右 (1,1) 入队,共 5 个弹出 (0,1):右 (0,2) 入队,共 6 个

第 3 层

弹出 (2,0):下 (3,0) 入队,右 (2,1) 入队,共 8 个弹出 (1,1):右 (1,2) 入队,共 9 个弹出 (0,2):无新节点,共 9 个

第 4 层

弹出 (3,0):下 (4,0) 入队,右 (3,1) 入队,共 11 个弹出 (2,1):右 (2,2) 入队,共 12 个弹出 (1,2):无新节点,共 12 个

第 5 层

弹出 (4,0):右 (4,1) 入队,共 13 个弹出 (3,1):右 (3,2) 入队,共 14 个弹出 (2,2):无新节点,共 14 个

此时队列为 [(4,1), (3,2)]。后续将依次弹出 (4,1) 并入队 (4,2);弹出 (3,2) 并入队 (3,3);弹出 (4,2) 无新节点;弹出 (3,3) 并入队 (3,4) 即 E。在 E 入队的那一刻,已入队格子总数为 17 个(含 S 和 E 本身)。

说明 按题面 5 × 5 网格与“上、下、左、右”的遍历顺序逐格模拟,第 5 层末已入队 14 个,第 6 层末为 16 个,第 7 层 E 入队时为第 17 个,与四个选项均不相符。推测流传版本在网格或选项的转录上存在出入,本题仍以所给答案 C 为准。

考点 广度优先搜索(BFS)的模拟。

第 9 题 · 最大公因数与互质

满足 1 ≤ n ≤ 100 且 gcd(n, 60) = 6 的正整数 n 共有多少个( )。

A. 8B. 6C. 4D. 5

参考答案 B

gcd(n, 60) = 6,说明 n 必须是 6 的倍数,且 n 与 60 的最大公因数恰好为 6。

分解质因数:60 = 22 × 3 × 5,6 = 2 × 3

设 n = 6k,则 gcd(6k, 60) = 6 等价于 gcd(k, 10) = 1,即 k 不再含有因子 2 和 5。

由 n ≤ 100 得 6k ≤ 100,即 k ≤ 16。

在 1~16 中与 10 互质的 k 有:1, 3, 7, 9, 11, 13

对应 n 为:6, 18, 42, 54, 66, 78,共 6 个。

考点 最大公因数与互质的判定。

第 10 题 · 硬币凑数

某国硬币面值为 1 元、4 元、6 元且数量不限,凑出 9 元最少需要多少枚( )。

A. 3B. 4C. 5D. 2

参考答案 A

尝试所有组合:

6 + 1 + 1 + 1 = 9,共 4 枚4 + 4 + 1 = 9,共 3 枚4 + 1 + 1 + 1 + 1 + 1 = 9,共 6 枚1 × 9 = 9,共 9 枚

最少为 3 枚,选 A。

第 11 题 · 指针运算与数组

执行下列代码,输出是( )。

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];

A. 14,13B. 8,13C. 14,7D. 14,2

参考答案 A

初始:a = {1, 3, 5, 7, 9}int *p = a + 2; 此时 p 指向 a[2](值为 5)p[0] 即 a[2] = 5,p[2] 即 a[4] = 9*(p − 1) = 5 + 9 = 14,而 *(p−1) 即 a[1],所以 a[1] = 14p[1] = *(a + 1) − a[0],p[1] 即 a[3],*(a+1) 即 a[1](当前值 14),a[0] = 1,所以 a[3] = 14 − 1 = 13

输出:a[1] = 14,a[3] = 13,即 "14,13"。

考点 指针运算、数组与指针的关系。

第 12 题 · 二分查找的时间复杂度

在含 1000 个互不相同元素的升序数组中,用二分法查找给定值(返回元素位置或报告不存在),最坏情况下需要与数组元素比较多少次( )。

A. 500B. 9C. 11D. 10

参考答案 D

二分查找最坏比较次数 = ⌊log2 n⌋ + 1

n = 1000,log2 1000 ≈ 9.97,⌊9.97⌋ = 9

次数 = 9 + 1 = 10 次

考点 二分查找的时间复杂度。

第 13 题 · 前缀和数组与差分

数组 a[1..n] 的前缀和数组 s(即 s[i] = a[1] + a[2] + … + a[i])满足 s[i] = 3i2 + i。则 a[10] 的值是( )。

A. 252B. 310C. 58D. 61

参考答案 C

a[10] = s[10] − s[9]s[10] = 3 × 102 + 10 = 310s[9] = 3 × 92 + 9 = 252a[10] = 310 − 252 = 58

考点 前缀和数组的定义与差分计算。

第 14 题 · 中位数与绝对值距离最小化

数轴上有 7 个点,坐标分别为 1、3、4、7、10、15、20。在数轴上选取一个整数坐标点 P,使 P 到这 7 个点的距离之和最小,这个最小距离和是( )。

A. 37B. 42C. 40D. 38

参考答案 A

使数轴上各点距离之和最小的点 P 是中位数点。

7 个点的中位数是第 4 小的数,即 7。

以 P = 7 为基准计算距离和:|1−7| = 6,|3−7| = 4,|4−7| = 3,|7−7| = 0|10−7| = 3,|15−7| = 8,|20−7| = 13

总和:6 + 4 + 3 + 0 + 3 + 8 + 13 = 37

考点 中位数在绝对值距离最小化中的应用。

第 15 题 · 无向图的度数定理

一个无向图有 10 个顶点,其中 4 个顶点的度为 3,其余顶点的度均为 4,则该图的边数是( )。

A. 36B. 18C. 17D. 20

参考答案 B

顶点度数之和 = 4 × 3 + (10 − 4) × 4 = 12 + 24 = 36无向图中,边数 = 度数之和 / 2 = 36 / 2 = 18

考点 无向图的度数定理(握手定理)。

二、阅读程序

共 3 大题,共 40 分。

阅读程序(1)· 进制减半模拟

01  #include <iostream> 02  using namespace std; 03  int main() { 04      int n; 05      cin >> n; 06      int x = 1, y = 1; 07      while (n > 0) { 08          if (n % 2 == 0) { 09              ++x; 10          } else { 11              ++x; 12              ++y; 13          } 14          n = n / 2; 15      } 16      cout << x << ' ' << y << endl; 17      return 0; 18  }

程序功能 输入 n(非负整数),循环每次将 n 除以 2,x 统计循环执行次数(二进制位数 + 1),y 统计 n 为奇数的次数(二进制中 1 的个数 + 1)。

判断题

第 16 题(1 分)

当输入为 3 时,程序输出为 3 3。

判断 正确 ✓

3 的二进制为 11。

n = 3(奇数):x = 2, y = 2, n = 1n = 1(奇数):x = 3, y = 3, n = 0

输出 "3 3"。

第 17 题

将第 11 行的 ++x; 删除后,程序输出的两个数一定相等。

判断 错误 ×

删除后偶数分支仍执行 ++x,奇数分支只执行 ++y,两个计数不再同步增加,输出不一定相等。例如 n = 3:n = 3(奇数)时仅 y 增加,x = 1, y = 2, n = 1;n = 1(奇数)时 x = 1, y = 3, n = 0,输出 "1 3",两数不等。

第 18 题

假设输入为非负整数,则程序输出的第一个数一定不小于第二个数。

判断 正确 ✓

x 记录循环执行次数(二进制位数 + 1),y 记录二进制中 1 的个数 + 1。1 的个数不可能超过总位数,因此 x ≥ y 恒成立。

单选题

第 19 题

将第 7 行的 while (n > 0) 改为 while (n >= 0) 后,程序可能出现的问题是( )。

A. 陷入死循环B. 输出结果比原来大C. 输出结果比原来小D. 输出结果不受影响

参考答案 A

n 为非负整数。n = 0 时原循环不进入;改为 n ≥ 0 后进入,0 % 2 = 0 执行 ++x,n = 0 / 2 = 0,永远无法达到 n < 0,陷入死循环。

第 20 题

当输入为 6 时,输出为( )。

A. 3 3B. 4 2C. 4 3D. 5 2

参考答案 C

6 的二进制为 110。

n = 6(偶数):x = 2, n = 3n = 3(奇数):x = 3, y = 2, n = 1n = 1(奇数):x = 4, y = 3, n = 0

输出 "4 3"。

第 21 题

若输入 n 依次取遍 0, 1, 2, …, 231 − 1 中的所有整数,则程序输出的第二个数恰好为 2 的次数为( )。

A. 16B. 30C. 31D. 32

参考答案 C

输出第二个数 y = 二进制中 1 的个数 + 1。y = 2 表示二进制中恰好有 1 个 1。

在 0 ~ 231 − 1 范围内,二进制中恰好有 1 个 1 的数为 20, 21, …, 230,共 31 个。

阅读程序(2)· 高精度加法

01  #include <algorithm> 02  #include <iostream> 03  #include <string> 04  using namespace std; 05  int a[100007], b[100007], c[100007],         carry[100007]; 06  string input_str; 07  int a_len, b_len; 08  int main() { 09      cin >> input_str; 10      a_len = input_str.size(); 11      for (int i = 0; i < a_len; i++) { 12          a[i] = input_str[a_len - i - 1] - '0'; 13      } 14      cin >> input_str; 15      b_len = input_str.size(); 16      for (int i = 0; i < b_len; i++) { 17          b[i] = input_str[b_len - i - 1] - '0'; 18      } 19      carry[0] = 0; 20      for (int i = 0;             i < max(a_len, b_len) + 1; i++) { 21          c[i] = a[i] + b[i] + carry[i]; 22          if (c[i] >= 10) { 23              carry[i + 1] = 1; 24              c[i] -= 10; 25          } else { 26              carry[i + 1] = 0; 27          } 28      } 29      for (int i = max(a_len, b_len);             i >= 0; i--) { 30          cout << c[i]; 31      } 32      cout << endl; 33      return 0; 34  }

判断题

第 22 题

当输入为 123 456 时,程序输出为 0579。

判断 正确 ✓

123 + 456 = 579。循环到 max(3,3) + 1 = 4 位。i = 0~3 分别计算出 c[0] = 9, c[1] = 7, c[2] = 5, c[3] = 0。从 i = 3 到 0 输出 "0579"。

第 23 题

假设输入的两个数均不含前导零,则程序输出的结果也一定不会含有前导零。

判断 错误 ×

如果两个数位数相同且无进位(如 111 + 222 = 333),最高位 c[max_len] = 0,输出时会带前导 0,如 "0333"。

第 24 题

将第 21 行改为 c[i] = a[i] + b[i]; 后,程序输出的结果一定比原来的结果小。

判断 错误 ×

改动只涉及第 21 行,第 22 至 24 行的进位与减 10 逻辑仍然生效,因此不含进位的加法结果在某些输入下与原结果数值相同。例如输入 111 222:原程序逐位相加并处理进位,输出 0333;改动后 c[i] = a[i] + b[i] 得 3、3、3,第 22 行判断 3 ≥ 10 不成立、不进位,同样输出 0333,数值相等。既然存在结果相等的输入,结论“一定比原来的结果小”不成立。

单选题

第 25 题

当输入为 12345 678 时,输出为( )。

A. 012923B. 013023C. 13023D. 130230

参考答案 B

12345 + 678 = 13023。逐位进位后 c[5] = 0, c[4] = 1, c[3] = 3, c[2] = 0, c[1] = 2, c[0] = 3,逆序输出 "013023"。

第 26 题

将第 22 行的 if (c[i] >= 10) 改为 if (c[i] > 10) 后,当输入为 95 15 时,输出为( )。

A. 01010B. 110C. 140D. 1410

参考答案 A

95 + 15 = 110。改为 > 10 后 c[i] = 10 不进位。

c[0] = 5 + 5 + 0 = 10,10 > 10 为 false,不进位,c[0] = 10c[1] = 9 + 1 + 0 = 10,不进位,c[1] = 10c[2] = 0

输出 "01010"。

第 27 题

假设输入的两个数均为 n 位正整数(不含前导零),且它们的和小于 10n,则程序输出的字符串一定满足( )。

A. 第一个字符一定不为 '0'B. 长度一定为 nC. 长度一定为 n + 1,且第一个字符为 '0'D. 长度可能为 n + 2

参考答案 C

和小于 10n 说明无最高位进位。循环到 n + 1 位,c[n] = 0,输出长度 n + 1 且第一个字符为 '0'。

阅读程序(3)· 质数递归搜索

01  #include <iostream> 02  using namespace std; 03  bool check_prime(int x) { 04      if (x <= 1) return false; 05      for (int i = 2; i * i <= x; i++) { 06          if (x % i == 0) return false; 07      } 08      return true; 09  } 10  int n; 11  void search_result(int x) { 12      if (!check_prime(x)) return; 13      if (x >= n) { 14          cout << x << endl; 15          return; 16      } 17      for (int i = 0; i <= 9; i++) { 18          search_result(x * 10 + i); 19      } 20  } 21  int main() { 22      cin >> n; 23      for (int i = 1; i <= 9; i++)             search_result(i); 24      return 0; 25  }

判断题

第 28 题

当输入为 10 时,程序的输出共有 10 行。

判断 错误 ×

n = 10 时程序实际输出 9 行:23、29、31、37、53、59、71、73、79。第一层只有 2、3、5、7 会被展开,4、6、8、9 不是质数,调用后立即返回;11、13、17、19 也不在输出中,因为以 1 开头的整棵子树在 check_prime(1) 为假时即被剪掉。9 行与题面所说 10 行不符,故该说法错误。

第 29 题

若输入的 n 不大于 5,则程序的输出中一定包含 5。

判断 正确 ✓

当 n ≤ 5 时,5 本身 ≥ n 且是质数,会被输出。因此一定包含 5。

第 30 题

若输入的 n 大于 10,将第 17 行的 for (int i = 0; i <= 9; i++) 改为 for (int i = 1; i <= 9; i += 2) 后,程序的输出结果一定不变。

判断 正确 ✓

n > 10 时,输出的数都是大于 10 的质数。大于 10 的质数个位只能是 1、3、7、9,递归中追加偶数数字或 5 不会产生新的可剔除质数。因此输出结果不变。

单选题

第 31 题

当输入为 24 时,程序输出的第 3 行为( )。

A. 23B. 29C. 31D. 239

参考答案 B

当 n = 24 时,可剔除质数 DFS 序中 ≥ 24 的第 3 个输出为 29。

第 32 题

下列关于该程序输出的说法中,正确的是( )。

A. 输出的数一定按照从小到大的顺序排列B. 随着输入 n 的增大,输出的行数一定不会增加C. 输出的数的个位数字只可能是 3 或 7D. 输出的每个大于等于 10 的数,十进制下删去它的末位数字后得到的数一定是质数

参考答案 D

A 错:DFS 顺序不是数值递增。

B 错:n 增大时输出行数可能增加。例如 n = 23 时输出 23、29、31、37、53、59、71、73、79,共 9 行;n = 24 时 23 本身不再打印,但会继续向下递归出 233 与 239,加上 29、31、37、53、59、71、73、79,共 10 行。

C 错:个位也可能是 1、9。

D 对:由可剔除质数的定义保证。

第 33 题

当输入为 200 时,程序输出的行数为( )。

A. 12B. 13C. 14D. 15

参考答案 C

所有 ≥ 200 的可剔除质数共有 14 个,输出 14 行。

三、完善程序

共 2 大题,每题 5 空,共 30 分。

完善程序(1)· 进制转换(m 进制转 n 进制)

01  #include <iostream> 02 03  constexpr int N = 100005; 04  long long b[N]; 05 06  int main() { 07      long long n, m, d; 08      std::cin >> n >> m >> d; 09      int len = 1; 10      for (int i = 0; i < d; i++) { 11          long long x; 12          std::cin >> x; 13          for (int j = len; j >= 1; j--) 14              b[j] = ①; 15          b[0] = ②; 16          len++; 17          for (int j = 0; j < len; j++) 18              if (b[j] >= n) { 19                  b[j + 1] += ③; 20                  b[j] = ④; 21                  if (j + 1 == len) len++; 22              } 23      } 24      while (⑤) len--; 25      for (int i = len - 1; i >= 0; i--) 26          std::cout << b[i] << ' '; 27      return 0; 28  }

第 34 题(①处)

A. b[j] * nB. b[j] * mC. b[j - 1] * nD. b[j - 1] * m

参考答案 D

将已有结果逐位乘以 m(进制基数),从高位到低位处理。

第 35 题(②处)

A. x * nB. xC. 0D. m

参考答案 B

将新一位数字 x 放入 b[0](个位)。

第 36 题(③处)

A. b[j] / mB. b[j] % nC. b[j] % mD. b[j] / n

参考答案 D

进位时高位加上 b[j] 除以 n 的整数部分。

第 37 题(④处)

A. b[j] / mB. b[j] % nC. b[j] % mD. b[j] / n

参考答案 B

进位后当前位保留模 n 的余数。

第 38 题(⑤处)

A. len > 0 && b[len - 1] == 0B. len > 0 && b[0] == 0C. len > 1 && b[len - 1] == 0D. len > 1 && b[0] == 0

参考答案 C

去除高位前导零,当最高位为 0 且长度 > 1 时缩短。

完善程序(2)· 平衡分割(递归枚举分段)

01  #include <algorithm> 02  #include <iomanip> 03  #include <iostream> 04 05  using namespace std; 06 07  constexpr int N = 25; 08  int n; 09  char s[N]; 10  double ans = 1e100; 11 12  int get_val(char c) { return ①; } 13 14  void split(int l, int cnt,         double minb, double maxb) { 15      if (l > n) { 16          if (cnt == 0) return; 17          ans = min(ans, maxb - minb); 18          return; 19      } 20      int sum = 0; 21      for (②) { 22          sum += ③; 23          double nwb = ④; 24          split(⑤); 25      } 26  } 27 28  int main() { 29      cin >> n >> s + 1; 30      split(1, -1, 1e100, -1e100); 31      cout << fixed << setprecision(6) << ans; 32      return 0; 33  }

第 39 题(①处)

A. (c >= '0' && c <= '9') ? (c - '0') : (c - 'A' + 10)B. c - '0'C. c - 'A'D. (c >= '0' && c <= '9') ? (c - '0') : (c - 'A')

参考答案 B

输入的字符串只包含数字字符 0~9,直接 c - '0' 得到数值。

第 40 题(②处)

A. int r = l; r <= n; r++B. int r = l; r < n; r++C. int r = 1; r <= n; r++D. int r = l; r++ < n

参考答案 D

枚举当前段的结束位置。r++ < n 先取 r 的值参与比较、再自增,因此进入循环体时 r 依次为 l + 1, l + 2, …, n;配合 ③ 处取 s[r − 1],即依次把 s[l], s[l + 1], …, s[n − 1] 累加进当前段的和,与第 41 题解析互为印证。

第 41 题(③处)

A. get_val(s[r])B. get_val(s[r-1])C. s[r-1]D. s[r]

参考答案 C

由于 r 已在条件中自增,用 s[r-1] 取当前字符的 ASCII 码。

第 42 题(④处)

A. sum / (r - l + 1)B. 1.0 * sum / (r - l + 1)C. 1.0 * sum / (r - l)D. sum * 1.0 / n

参考答案 A

直接用整数除法计算当前段平均值。

第 43 题(⑤处)

A. r + 1, cnt + 1, min(minb, nwb), max(maxb, nwb)B. r, cnt + 1, minb, maxbC. r + 1, cnt, nwb, nwbD. r, cnt, min(minb, nwb), max(maxb, nwb)

参考答案 D

递归处理下一段,起始位置为 r,段数不变,更新最小平均值和最大平均值。

参考答案一览

题号
答案
题号
答案
题号
答案
题号
答案
1
B
12
D
23
×
34
D
2
D
13
C
24
×
35
B
3
C
14
A
25
B
36
D
4
C
15
B
26
A
37
B
5
B
16
27
C
38
C
6
D
17
×
28
×
39
B
7
D
18
29
40
D
8
C
19
A
30
41
C
9
B
20
C
31
B
42
A
10
A
21
C
32
D
43
D
11
A
22
33
C

本次试卷的考点分布较为集中:进制与数据类型(第 1、2 题)、栈与树与图的基础性质(第 4、5、15 题)、递推与容斥(第 6、7 题)、以及 BFS 模拟与指针数组(第 8、11 题)。阅读程序部分均为典型算法模型,完善程序部分一为进制转换、一为递归枚举,建议作为专项训练反复演练。

【长按识别二维码下载真题pdf】

● 纪丹名师工作室 · 专注初中信息科技教学

本文内容依据网络流传的 2026 CSP-J1 第一轮试题及参考答案整理,仅供教学参考。如与官方答案有出入,请以官方发布为准。

相关学习资料