2026 CSP-J 第一轮真题卷 入门级(C++)试题分析

四季读书网 4 0
2026 CSP-J 第一轮真题卷 入门级(C++)试题分析

📅 认证时间 2026.09.19✏️ 满分 100 分 · 共 43 题⏱️ 120 分钟

43 道小题横跨 12 个考点。本文逐题拆解 + 考点定位 + 备考建议,附参考答案(非官方,仅供学习参考,请以 CCF 官方答案为准)。

📋 试卷结构速览

板块
题号
题型
题量
分值
一、单项选择题
1 – 15
单选
15
30
二、阅读程序
16 – 33
判断 + 单选
18
40
三、完善程序
34 – 43
单选(填空)
10
30
合计
—
—
43
100

规则:判断题 1.5 分 / 选择题 3 分;阅读程序 + 完善程序共用 40+30 分,是拉分关键。

一、单项选择题 1–15 · 每题 2 分

共 15 题,覆盖数据类型、进制转换、运算优先级、栈、树、动态规划、BFS、数论、贪心、指针、二分、前缀和、中位数、图论。答案均为个人推演,请以 CCF 官方为准。

Q1 能精确存储整数 1018+1 的 C++ 数据类型是?

A. float   B. long long   C. double   D. int

参考答案B. long long

int 是 32 位(约 ±2×109),存不下 1018;float/double 是浮点,位数有限会丢失尾数精度;long long 为 64 位(±9.2×1018),能精确存储。

Q2 十六进制数 2F5 转换为八进制是?

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

参考答案B. 1635

先转二进制:2F5 = 0010 1111 0101;按 3 位一组切分:001 011 110 101 → 八进制 1 3 6 5 = 1635(十进制 757)。

Q3 执行 a=7,b=3; cout << a/b*b + a%b; 输出是?

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

参考答案C. 7

在 C++ 中整数除法取整:7/3=2;再乘以 b=3 得 2*3=6;取模 a%b=1;相加 6+1=7。注意:运算符优先级 * 与 / 相同、从左到右,因此实际是 (7/3)*3 + 7%3,而非 7*(3/3)+…。

Q4 栈:1、2、3、4 依次入栈,随时可出栈,不可能出现的出栈序列是?

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

参考答案C. 3,1,2,4

出 3 时栈内必留 1、2(1 在下、2 在上),则 2 必须先于 1 出栈,无法得到 3,1,2,4。A/B/D 都可构造。

Q5 有 100 个结点的完全二叉树,叶子结点个数是?

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

参考答案B. 50

完全二叉树 100 个结点,叶子数 = ⌈n/2⌉ = 50。前 5 层共 63 个结点,第 6 层 37 个;其中 13 个上层结点(无第 6 层子结点)与 37 个第 6 层结点合计为叶子。

Q6s+=i 当 i 是 3 或 5 的倍数时,s 最终值?

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

参考答案C. 2318

等差和 + 容斥:3 的倍数(3~99)1683 + 5 的倍数(5~95)950 − 15 的倍数(15~90)315 = 1683+950−315 = 2318。注意倍数只到不超过 100 的最大者。

Q7 上楼梯每步可上 1/2/3 级,走到第 8 级共有多少种?

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

参考答案D. 81

递推 f[i]=f[i−1]+f[i−2]+f[i−3],f[0]=1, f[1]=1, f[2]=2;逐项 3,5,9,17,31,59… 得 f[8]=81。

Q8 5×5 网格 BFS(上、下、左、右),E 第一次入队时,已入队格子共多少个?

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

参考答案A. 15

按「上、下、左、右」逐层 BFS 精确模拟:E(3,4) 在第 14 步被标记入队,计入 E 后,已入队格子(含 S)共 15 个。第 3 列的障碍墙迫使 E 经由第 4 列绕路。

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

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

参考答案B. 6

令 n=6m,则 gcd(n,60)=6 ⟺ gcd(m,10)=1;m∈[1,16] 且与 10 互质(m≡1,3,7,9 mod 10)→ 6 个。

Q10 硬币 1、4、6 元不限,凑 9 元最少需几枚?

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

参考答案A. 3

3 枚即可:4+4+1=9;2 枚最大 6+4=10,但凑不出 9(4+4=8、6+4=10、6+1=7)。

Q11 指针:p=a+2; *(p-1)=p[0]+p[2]; p[1]=*(a+1)-a[0]; 输出 a[1],a[3]?

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

参考答案A. 14,13

p 指向 a[2]。第一行 a[1]=a[2]+a[4]=5+9=14;第二行 a[3]=a[1]−a[0]=14−1=13。考点:指针下标。

Q12 1000 个升序元素二分查找,最坏需与元素比较多少次?

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

参考答案D. 10

最坏比较次数 = ⌈log₂1000⌉ = ⌈9.97⌉ = 10(29=512 < 1000 ≤ 210=1024)。

Q13 前缀和 s[i]=3i²+i,则 a[10] 的值是?

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

参考答案C. 58

a[10]=s[10]−s[9]=(3×100+10)−(3×81+9)=310−252=58。

Q14 数轴 7 点 {1,3,4,7,10,15,20},取整数点 P 使距离和最小,最小值是?

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

参考答案A. 37

到奇数个点距离和在中位数处最小,中位数=7;距离和 = 6+4+3+0+3+8+13 = 37。

Q15 无向图 10 顶点:4 个度为 3,6 个度为 4,边数是?

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

参考答案B. 18

握手定理:边数 = 度数和 / 2 = (4×3 + 6×4) / 2 = 36 / 2 = 18。

二、阅读程序 16–33 · 共 40 分

共 3 段程序:第 1 段「除以 2」循环(16–21)、第 2 段「大整数加法」(22–27)、第 3 段「质数搜索」(28–33)。判断题 1.5 分、单选题 3 分。以下答案为逐行模拟推演。

第 1 段:反复除以 2 的 x / y 计数(16–21)

int x=1,y=1; while(n>0){   if(n%2==0){ x++; }   else{ x++; y++; }   n=n/2; }

Q16 输入 3 时,输出为 3 3?

参考答案√

n=3:n>0,3 为奇数→x=2,y=2,n=1;1 为奇数→x=3,y=3,n=0 退出。输出 3 3。

Q17 删除第 11 行 ++x 后,两个数一定相等?

参考答案×

删后 x 只在偶数时 +1,y 在奇数时 +1。如 n=1 输出 0 1、n=2 输出 1 0,不相等。

Q18 输入非负整数,第一个数一定不小于第二个数?

参考答案√

每轮若奇则 x、y 同增,若偶则仅 x 增,故恒有 x≥y。

Q19 把 while(n>0) 改为 while(n>=0) 可能出现的问题是?

A. 死循环   B. 结果偏大   C. 结果偏小   D. 不受影响

参考答案A. 陷入死循环

n 递减到 0 后 n/2 仍为 0,条件 n>=0 恒成立,死循环。

Q20 输入 6 时输出是?

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

参考答案C. 4 3

6 偶→x=2,n=3;3 奇→x=3,y=2,n=1;1 奇→x=4,y=3,n=0 退出。输出 4 3。

Q21 n 取遍 0…231−1,第二个数恰为 2 的次数是?

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

参考答案C. 31

y=1+(n 的二进制 1 的个数)。y=2 ⟺ n 恰好一个 1 位 ⟺ n 为 2 的幂。[0,231−1] 内共 31 个(20…230)。

第 2 段:大整数加法(22–27)

int a[100007],b[100007],c[100007],carry[100007]; // 低位在前读入 a[i],b[i] for(i=0;i<max(alen,blen)+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; } // 高位到低位输出

Q22 输入 123 456,输出 0579?

参考答案√

123+456=579,逐位输出(低位在前转回)即 0579。

Q23 两数均无前置零,输出也一定无前置零?

参考答案×

123+456=579,输出 0579 带前置零。错。

Q24 第 21 行改为 c[i]=a[i]+b[i](去掉 carry),结果一定更小?

参考答案×

去掉进位后,进位位不再向高位进 1,高位可能反而偏小,但低位不带走 10 的部分会变大。如 95+15:原 110,去进位低位 5+5=10 不向十位进,得 1000(高位小、低位大),整体不定,故"一定更小"错误。

Q25 输入 12345 678,输出是?

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

参考答案B. 013023

12345+678=13023,5 位输出(高位补 0)即 013023。

Q26 第 22 行 if(c[i]>=10) 改 if(c[i]>10),输入 95 15 输出?

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

参考答案A. 01010

95+15=110;改为 >10 后 10 不再进位(仅 >10 才进),输出 01010。

Q27 两 n 位正整数(无前置零)且和 <10n,输出字符串一定满足?

A. 首字符一定不为 0   B. 长度一定为 n   C. 长度 n+1 且首为 0   D. 长度可能为 n+2

参考答案C. 长度一定为 n+1,且首字符为 0

输出固定打印 max(a_len,b_len)+1 位。两数均 n 位无前导零,max=n,故输出 n+1 位;和 <10n 说明没有最高位进位,首位为 0。选 C。

第 3 段:递归搜索质数(28–33)

bool check_prime(int x); // x>1 且非合数 void search_result(int x){   if(!check_prime(x)) return;   if(x>=n){ cout<<x<<endl; return; }   for(i=0;i<=9;i++) search_result(x*10+i); } main(){ cin>>n; for(i=1;i<=9;i++) search_result(i); }

Q28 输入 10,输出共 10 行?

参考答案×

n=10 时,递归只搜索可截断质数(每次删末位仍为质数):23、29、31、37、53、59、71、73、79 共 9 行,非 10 行。

Q29 n≤5 时,输出中一定包含 5?

参考答案√

模拟 n=1..5,输出均含 5(5 本身是质数,递归展开 5→50…59 中 53、59 满足 ≥n,且 5 在 x≥n 时直接输出)。

Q30 n>10,第 17 行改为 for(i=1;i<=9;i+=2),输出结果一定不变?

参考答案√

质数个位只能是 1、3、7、9,i+=2 从 1 起恰好覆盖 {1,3,5,7,9} 中的 1,3,7,9(5 仅当 x=5 时可能,但 5 是质数且 x≥10 时 5*10+5=55 非质数会被 check_prime 过滤),故结果不变。

Q31 输入 24,输出的第 3 行是?

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

参考答案B. 29

DFS 输出序为 233、239、29、31、37…(先展开 2 的子树再展开 3),第 3 行为 29。注意本题输出并非严格升序,这是与 Q32 对照的关键。

Q32 关于该程序输出,正确的是?

A. 一定升序   B. n 增大输出行数不增   C. 个位只能是 3 或 7   D. ≥10 的数删末位后仍是质数

参考答案D. 输出的每个 ≥10 的数删去末位后一定是质数

递归本质:只有当前 x 为质数才继续;≥10 的输出数由某个质数 x 扩展 x*10+i 而来,删末位即得 x,必为质数。A 错(233 在 29 前);B 错(n 增大会输出更多行);C 错(个位还可为 1、9)。

Q33 输入 200,输出行数为?

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

参考答案C. 14

≥200 的可截断质数共 14 个:233、239、293、311、313、317、373、379、593、599、719、733、739、797。

三、完善程序 34–43 · 每空 3 分

共 2 段程序:第 1 段「进制减半」(34–38,共 5 空)、第 2 段「平衡分割」(39–43,共 5 空)。均为单选填空,考对程序逻辑的理解与补全。

第 1 段:进制减半(m 进制 → n 进制,34–38)

int len = 1; for (int i = 0; i < d; i++) {   long long x; 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--;

Q34 ① 处填?

A. b[j]*n   B. b[j]*m   C. b[j-1]*n   D. b[j-1]*m

参考答案B. b[j]*m

将 m 进制数整体放大 m 倍(等价于「高位左移」),再逐位归一化为 n 进制。

Q35 ② 处填?

A. x*n   B. x   C. 0   D. m

参考答案B. x

当前位 x 填入最低位 b[0]。

Q36 ③ 处填?

A. b[j]/m   B. b[j]%n   C. b[j]%m   D. b[j]/n

参考答案D. b[j]/n

进位量 = b[j] 除以目标进制 n 的商,向高位累加。

Q37 ④ 处填?

A. b[j]/m   B. b[j]%n   C. b[j]%m   D. b[j]/n

参考答案B. b[j]%n

b[j] 对 n 取模,保留该位数字。

Q38 ⑤ 处填?

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

参考答案C. len>1 && b[len-1]==0

去掉高位前导零,但保留至少 1 位(len>1),避免全 0 时 len 减到 0。

第 2 段:平衡分割(十六进制串分段,39–43)

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( ④ );   } } main(){ ... split( ⑤ ); }

Q39 ① 处填(十六进制字符转 0–15)?

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

参考答案B. c-(c<'A'?'0':'A'-10)

数字字符 '0'–'9' 减 '0';字母 'A'–'F' 减 ('A'−10),即 'A'→10、'F'→15。

Q40 ② 处填(for 循环遍历分段右端点 r)?

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

参考答案B. int r=l; r<n; ++r

r 取 l 到 n−1(末段右端点须留出空间),枚举下一段结束位置。

Q41 ③ 处填(新段平均值)?

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

参考答案C. sum*1.0/(r-l+1)

段长为 r−l+1,平均值 = 段内元素和 ÷ 段长,须 ×1.0 做浮点除法。

Q42 ④ 处填(递归调用)?

A. r+1,cnt+(r<n),min(mnb,nwb),max(mxb,nwb)   B. r+1,cnt+(r<=n),…   C. r+1,cnt+(r<n),max(mnb,nwb),min(mxb,nwb)   D. r+1,cnt+(r<=n),max(min)…

参考答案A. r+1, cnt+(r<n), min(mnb,nwb), max(mxb,nwb)

下一段从 r+1 开始;若 r<n 还余段则 cnt+1;新平均更新最值(min/max 正确对应)。

Q43 ⑤ 处填(初始调用)?

A. 0,0,1e100,-1e100   B. 0,0,-1e100,1e100   C. 1,0,-1e100,1e100   D. 1,0,1e100,-1e100

参考答案C. 1, 0, -1e100, 1e100

首段从下标 1 起;cnt=0 尚未分段;最值初值取 −∞/+∞(mnb 为极小、mxb 为极大)。

考点地图

本卷 43 题覆盖 CSP-J 入门级 12 个高频考点,按题型归类如下。

考点
对应题
题型
数据类型 / 进制转换
1, 2
单选
运算优先级 / 取整
3, 6
单选
栈 / 完全二叉树
4, 5
单选
线性 DP(爬楼梯)
7
单选
BFS 网格搜索
8
单选
数论(gcd / 硬币贪心)
9, 10
单选
指针 / 二分查找
11, 12
单选
前缀和 / 中位数 / 图论
13, 14, 15
单选
除 2 循环 / 大整数加法 / 递归质数
16–33
阅读
进制转换(逐位归一化)
34–38
完善
递归分段(DP 枚举)
39–43
完善

备考建议

🎯 给考生:3 个提分重点

  1. 单选求稳(30 分):
    进制转换、运算优先级、DP 递推、BFS 手推是固定考点,建议用「小数据手算 + 选项代回」快速锁定答案,控制每道 2 分钟以内。
  2. 阅读求准(40 分):
    三段程序各有「陷阱题」(如改 while 条件、删某行),务必逐行跟踪 1–2 组输入再判断,避免凭印象;判断题 1.5 分要敢于排除。
  3. 完善求快(30 分):
    填空先读懂算法框架(进制归一化 / 递归分段),再逐个空代入选项验证,最后用「边界值(全 0 / 首位)+ 正常例」双重检验。

📚 给老师:本卷可布置的分层练习

  1. 基础层:
    单选 1–6 + 阅读第 1 段(16–21),覆盖数据类型、进制、运算、树、DP、循环追踪。
  2. 进阶层:
    单选 7–15 + 阅读第 2/3 段(22–33),训练 BFS、数论、指针、二分、中位数、图论与大数、递归。
  3. 拔高层:
    完善程序 34–43,要求完整补全两段算法并说明每空依据,强化「算法框架 + 边界」思维。

写在最后:入门级(CSP-J)重在夯实「循环、递归、基础数据结构 + 数论 + 基本 DP」,本卷 43 题无偏题怪题,把上面的考点逐个吃透,再辅以历年真题限时训练,第一轮通过率会明显提升。文中所有答案均为个人推演,仅供学习参考,最终以 CCF 官方答案为准。

抱歉,评论功能暂时关闭!