📅 认证时间 2026.09.19✏️ 满分 100 分 · 共 43 题⏱️ 120 分钟
43 道小题横跨 12 个考点。本文逐题拆解 + 考点定位 + 备考建议,附参考答案(非官方,仅供学习参考,请以 CCF 官方答案为准)。
📋 试卷结构速览
规则:判断题 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 个高频考点,按题型归类如下。
备考建议
🎯 给考生:3 个提分重点
- 单选求稳(30 分):
进制转换、运算优先级、DP 递推、BFS 手推是固定考点,建议用「小数据手算 + 选项代回」快速锁定答案,控制每道 2 分钟以内。 - 阅读求准(40 分):
三段程序各有「陷阱题」(如改 while 条件、删某行),务必逐行跟踪 1–2 组输入再判断,避免凭印象;判断题 1.5 分要敢于排除。 - 完善求快(30 分):
填空先读懂算法框架(进制归一化 / 递归分段),再逐个空代入选项验证,最后用「边界值(全 0 / 首位)+ 正常例」双重检验。
📚 给老师:本卷可布置的分层练习
- 基础层:
单选 1–6 + 阅读第 1 段(16–21),覆盖数据类型、进制、运算、树、DP、循环追踪。 - 进阶层:
单选 7–15 + 阅读第 2/3 段(22–33),训练 BFS、数论、指针、二分、中位数、图论与大数、递归。 - 拔高层:
完善程序 34–43,要求完整补全两段算法并说明每空依据,强化「算法框架 + 边界」思维。
写在最后:入门级(CSP-J)重在夯实「循环、递归、基础数据结构 + 数论 + 基本 DP」,本卷 43 题无偏题怪题,把上面的考点逐个吃透,再辅以历年真题限时训练,第一轮通过率会明显提升。文中所有答案均为个人推演,仅供学习参考,最终以 CCF 官方答案为准。