






















2024 年 CSP-J(入门级)第一轮认证于 2024 年 9 月 21 日举行。本年度试卷延续了CSP初赛一贯的考查风格,涵盖了计算机基础、数据类型与存储、进制转换、组合数学、C++ 语法基础、数据结构和图论入门等多个核心领域。
本文将为您逐题展示原题,并给出深度解析,帮助 CSP-J 备考同学精准对标考点。这也是本系列 CSP-J 2024 第一轮真题解析的第一篇,后续还有阅读程序题和完善程序题的解析,敬请期待。
原题: 32 位 int 类型的存储范围是( )
A. -2147483647 ~ +2147483647
B. -2147483647 ~ +2147483648
C. -2147483648 ~ +2147483647
D. -2147483648 ~ +2147483648
正确答案: C
深度解析: 本题考查 C++ 中 32 位有符号整数的补码表示范围。
32 位有符号整数采用补码(Two’s Complement)表示。其中:
因此其范围为 $-2^{31}$ 到 $2^{31} - 1$,即 -2147483648 ~ +2147483647。
知识扩展: 注意补码的非对称性——负数端比正数端多 1 个。这是因为 0 只有一种表示方式(全 0),不像原码有 +0 和 -0 之分。常见整数类型的范围:
类型 字节数 范围 char1 -128 ~ 127 short2 -32768 ~ 32767 int4 $-2^{31}$ ~ $2^{31}-1$ long long8 $-2^{63}$ ~ $2^{63}-1$
原题: 计算 $(148 - 1010_2) \times D{16} - 1101_2$ 的结果是( )
A. 13
B. 14
C. 15
D. 16
正确答案: A
深度解析: 本题考查 多进制之间的混合运算。解题关键:先将所有数统一转换成十进制,再进行四则运算。
代入原式:
\[(12 - 10) \times 13 - 13 = 2 \times 13 - 13 = 26 - 13 = 13\]
知识扩展: 进制转换是 CSP 初赛的常考题型。记住以下技巧:
- 八进制每位权值:$8^0 = 1, 8^1 = 8, 8^2 = 64$
- 十六进制中 A~F 分别代表 10~15
- 二进制转十进制从右到左按位乘以 $2^n$
原题: 某公司有 10 名员工,分为 3 个部门:A 部门有 4 名员工,B 部门有 3 名员工,C 部门有 3 名员工。现需要从这 10 名员工中选出 4 名组成一个工作组,且每个部门至少要有 1 人。问有多少种选择方式?( )
A. 120
B. 126
C. 132
D. 238
正确答案: B
深度解析: 本题考查 组合数学与分类讨论。
每个部门至少选 1 人、总共选 4 人,必然有且仅有一个部门选 2 人。按哪个部门多选 1 人分类讨论:
情况一:A 部门选 2 人,B、C 各选 1 人 \(C_4^2 \times C_3^1 \times C_3^1 = 6 \times 3 \times 3 = 54\)
情况二:B 部门选 2 人,A、C 各选 1 人 \(C_3^2 \times C_4^1 \times C_3^1 = 3 \times 4 \times 3 = 36\)
情况三:C 部门选 2 人,A、B 各选 1 人 \(C_3^2 \times C_4^1 \times C_3^1 = 3 \times 4 \times 3 = 36\)
总计:$54 + 36 + 36 = \mathbf{126}$ 种。
知识扩展: 解组合数学题,要善用 “分类不重不漏” 的思想。本题也可用”补集法”:从 $C_{10}^4 = 210$ 中减去不满足条件的方案数(某个部门无人入选),但分类讨论更直观。
原题: 以下哪个序列对应数字 0 至 8 的 4 位二进制格雷码(Gray code)?( )
A. 0000, 0001, 0011, 0010, 0110, 0111, 0101, 1000
B. 0000, 0001, 0011, 0010, 0110, 0111, 0100, 0101
C. 0000, 0001, 0011, 0010, 0100, 0101, 0111, 0110
D. 0000, 0001, 0011, 0010, 0110, 0111, 0101, 0100
正确答案: D
深度解析: 本题考查 格雷码(Gray Code) 的生成规则。
格雷码的核心特征:相邻两个码字之间仅有一位不同。
4 位格雷码序列(0~15)的前 9 个(0~8)为:
| 十进制 | 二进制 | 格雷码 |
|---|---|---|
| 0 | 0000 | 0000 |
| 1 | 0001 | 0001 |
| 2 | 0010 | 0011 |
| 3 | 0011 | 0010 |
| 4 | 0100 | 0110 |
| 5 | 0101 | 0111 |
| 6 | 0110 | 0101 |
| 7 | 0111 | 0100 |
| 8 | 1000 | 1100 |
知识扩展: 二进制数 $B$ 转格雷码 $G$ 的公式:$G = B \oplus (B » 1)$。格雷码在数字电路、传感器编码和纠错码中有广泛应用,因为相邻编码只变化一位,可避免竞争冒险问题。
用 C++ 实现:
1 2 3 int binaryToGray(int n) { return n ^ (n >> 1); }
原题: 记 1KB 为 1024 字节(byte),1MB 为 1024KB,那么 1MB 是多少二进制位(bit)?( )
A. 1000000
B. 1048576
C. 8000000
D. 8388608
正确答案: D
深度解析: 本题考查 存储容量的单位换算。
计算过程:
\[1 \text{MB} = 1024 \text{KB} = 1024 \times 1024 \text{B} = 1048576 \text{B}\] \[1048576 \text{B} \times 8 \text{bit/B} = 8388608 \text{bit}\]
知识扩展: 注意 B(Byte)和 b(bit)的区别。1 Byte = 8 bits。在网络带宽中常用 bps(bits per second),而文件大小常用 Bytes。
选项 B 的 1048576 正好是 $1024^2$,即 1MB 的字节数,这是一个常见的干扰项。
原题: 以下哪个不是 C++ 中的基本数据类型( )
A. int
B. float
C. struct
D. char
正确答案: C
深度解析: 本题考查 C++ 数据类型的分类。
C++ 的数据类型分为两大类:
int、float、double、char、bool 等struct、class、union、enum 等struct 是用于定义结构体的关键字,属于复合数据类型,而非基本数据类型。
知识扩展: C++ 中常见基本数据类型及其大小:
类型 大小 说明 bool1 字节 布尔值 char1 字节 字符 int4 字节 整数 float4 字节 单精度浮点数 double8 字节 双精度浮点数
原题: 以下哪个不是 C++ 中的循环语句( )
A. for
B. while
C. do-while
D. repeat-until
正确答案: D
深度解析: 本题考查 C++ 语言的循环结构。
C++ 支持的三种循环结构:
| 循环类型 | 语法 | 特点 |
|---|---|---|
for | for (init; cond; step) | 已知循环次数时常用 |
while | while (cond) | 先判断后执行 |
do-while | do {...} while (cond) | 先执行后判断,至少执行一次 |
repeat-until 是 Pascal 语言 中的循环结构,不是 C++ 的语法。它的功能类似于 do-while,但条件判断逻辑相反(until 条件为真时退出循环,while 条件为真时继续循环)。
原题: 在 C/C++ 中,
(char)('a' + 13)与下面的哪一个值相等?( )
A. ‘m’
B. ‘n’
C. ‘z’
D. ‘l’
正确答案: B
深度解析: 本题考查 ASCII 码与字符运算。
字符 'a' 的 ASCII 码值为 97。加上 13 后:
\[97 + 13 = 110\]
ASCII 码 110 对应的字符为 'n'。
也可以直接数字母表:a → b → c → … → n,从 a 往后数 13 个位置就是 n。
知识扩展: 常用 ASCII 码值:
大小写转换:
'A' + 32 = 'a',即大写转小写加 32。
原题: 假设有序表中有 1000 个元素,则用二分法查找元素 X 最多需要比较( )次。
A. 25
B. 10
C. 7
D. 1
正确答案: B
深度解析: 本题考查 二分查找的最坏时间复杂度。
对于长度为 $n$ 的有序数组,二分查找最坏情况下的比较次数为 $\lfloor \log_2 n \rfloor + 1$。
代入 $n = 1000$:
\[\log_2 1000 \approx 9.97\] \[\lfloor 9.97 \rfloor + 1 = 10\]
验证:$2^{9} = 512 < 1000$,$2^{10} = 1024 > 1000$,因此最多需要 10 次 比较。
知识扩展: 二分查找的关键前提是数据已排序。其时间复杂度为 $O(\log n)$,相比线性查找的 $O(n)$ 效率提升巨大。当 $n = 10^6$ 时,线性查找最多需 100 万次,而二分查找仅需约 20 次。
原题: 下面的哪一个不是操作系统名字?( )
A. Notepad
B. Linux
C. Windows
D. macOS
正确答案: A
深度解析: 本题考查 操作系统基础概念。
知识扩展: 常见的操作系统分类:
类型 代表系统 桌面操作系统 Windows, macOS, Linux (Ubuntu, Fedora 等) 移动操作系统 Android, iOS, HarmonyOS 服务器操作系统 Linux (CentOS, Debian, RHEL 等), Windows Server 嵌入式/实时系统 FreeRTOS, VxWorks
原题: 在无向图中,所有顶点的度数之和等于( )。
A. 图的边数
B. 图的边数的两倍
C. 图的顶点数
D. 图的顶点数的两倍
正确答案: B
深度解析: 本题考查 图论基础——握手定理。
在无向图中,每条边连接两个顶点,为每个端点各贡献 1 个度。因此,每条边对度数总和的贡献是 2。
设无向图有 $m$ 条边,所有顶点的度数之和 $= 2m$,即图的边数的两倍。
这就是著名的握手定理(Handshaking Lemma):
\[\sum_{v \in V} \deg(v) = 2|E|\]
知识扩展: 握手定理的推论——任何图中,度数为奇数的顶点个数必为偶数。这是一个非常有用的结论,在判断图的连通性和欧拉路径的存在性时经常用到。
原题: 已知二叉树的前序遍历为 $[A, B, D, E, C, F, G]$,中序遍历为 $[D, B, E, A, F, C, G]$,请问该二叉树的后序遍历结果是?( )
A. $[D, E, B, F, G, C, A]$
B. $[D, E, B, F, G, A, C]$
C. $[D, B, E, F, G, C, A]$
D. $[D, B, E, F, G, A, C]$
正确答案: A
深度解析: 本题考查 二叉树的构建与遍历(已知前序和中序求后序)。
解题步骤:
[D, B, E] 为左子树元素,[F, C, G] 为右子树元素。[B, D, E],根节点为 B。[D, B, E] 中,B 的左节点为 D,右节点为 E。[C, F, G],根节点为 C。[F, C, G] 中,C 的左节点为 F,右节点为 G。D, E, BF, G, CA[D, E, B, F, G, C, A]知识扩展:
- 前序遍历(Pre-order):根 → 左 → 右
- 中序遍历(In-order):左 → 根 → 右
- 后序遍历(Post-order):左 → 右 → 根
必须包含中序遍历才能唯一确定一棵二叉树(即前序+中序,或后序+中序)。仅已知前序和后序在多数情况下无法唯一确定二叉树形态。
原题: 给定一个空栈,支持入栈和出栈操作。若入栈操作的元素依次是 1 2 3 4 5 6,其中 1 最先入栈,6 最后入栈,下面哪种出栈顺序是不可能的?( )
A. 6 5 4 3 2 1
B. 1 6 5 4 3 2
C. 2 4 6 5 3 1
D. 1 3 5 2 4 6
正确答案: D
深度解析: 本题考查 栈的合法出栈序列判定,是 CSP 初赛的高频考点。
栈的核心特性是 LIFO(后进先出)。逐一模拟验证:
✅ A. 6 5 4 3 2 1 全部压入后依次弹出,即标准的完全逆序输出,显然合法。
✅ B. 1 6 5 4 3 2
| 操作 | 栈状态(底→顶) | 已输出 |
|---|---|---|
| push 1, pop 1 | [] | 1 |
| push 2~6 | [2,3,4,5,6] | 1 |
| pop 6,5,4,3,2 | [] | 1 6 5 4 3 2 |
合法。
✅ C. 2 4 6 5 3 1
| 操作 | 栈状态 | 已输出 |
|---|---|---|
| push 1,2 → pop 2 | [1] | 2 |
| push 3,4 → pop 4 | [1,3] | 2 4 |
| push 5,6 → pop 6,5,3,1 | [] | 2 4 6 5 3 1 |
合法。
❌ D. 1 3 5 2 4 6
| 操作 | 栈状态 | 已输出 |
|---|---|---|
| push 1 → pop 1 | [] | 1 |
| push 2,3 → pop 3 | [2] | 1 3 |
| push 4,5 → pop 5 | [2,4] | 1 3 5 |
| 需要输出 2 | 栈顶是 4❗ | 💥 失败 |
关键矛盾:当需要弹出 2 时,4 在 2 的上方,必须先弹出 4,但序列要求先出 2 再出 4,这违反了栈的 LIFO 规则。
知识扩展: 判断合法出栈序列,可以用一个辅助栈模拟,时间复杂度 $O(n)$:
1 2 3 4 5 6 7 8 9 10 11 12 bool isValidPopOrder(vector<int>& push, vector<int>& pop) { stack<int> s; int j = 0; for (int x : push) { s.push(x); while (!s.empty() && s.top() == pop[j]) { s.pop(); j++; } } return s.empty(); }卡塔兰数:对于 $n$ 个元素的入栈序列,合法的出栈序列总数为卡塔兰数 $C_n = \frac{1}{n+1}\binom{2n}{n}$。例如 $n = 6$ 时,$C_6 = 132$ 种合法序列(总共 $6! = 720$ 种排列中仅有 132 种合法)。
原题: 有 5 个男生和 3 个女生站成一排,规定 3 个女生必须相邻。问有多少种不同的排列方式?( )
A. 4320 种
B. 5040 种
C. 3600 种
D. 2880 种
正确答案: A
深度解析: 本题考查 排列组合中的”捆绑法”。
解题步骤:
总方案数:
\[720 \times 6 = \mathbf{4320}\]
知识扩展: “捆绑法”用于处理“某些元素必须相邻”的约束。与之对应的是“插空法”,用于处理”某些元素不能相邻”的约束——先排列其他元素,再把受约束的元素插入空隙中。
原题: 编译器的主要作用是什么?( )
A. 直接执行源代码
B. 将源代码转换为机器代码
C. 进行代码调试
D. 管理程序运行时的内存
正确答案: B
深度解析: 本题考查 编译原理基础概念。
编译器(Compiler) 的核心功能是将程序员编写的高级语言源代码(如 C++、Java)翻译为计算机能直接执行的机器代码(或目标代码)。
这个过程包括:
知识扩展:
概念 说明 编译器 一次性将整个源代码翻译为机器代码(如 g++ 编译 C++) 解释器 逐行翻译并执行源代码(如 Python 解释器) IDE 集成开发环境,包含编辑器、编译器、调试器等工具的集合 选项 A 描述的是解释器的功能,选项 C 是调试器(Debugger)的功能,选项 D 是操作系统或运行时内存管理器的职责。
[!TIP] 本篇结语 以上为 CSP-J 2024 第一轮认证(初赛)1~15 题单选题的原题与全解析。后续第二篇将展开阅读程序题的深度解析,第三篇为完善程序题解析,敬请期待!如果你也在备考 CSP-J,欢迎收藏本系列文章,一起刷题提分!
所有代码已上传至Github:https://github.com/lihongzheshuai/yummy-code
GESP 学习专题站:GESP WIKI
"luogu-"系列题目可在洛谷题库进行在线评测。
"bcqm-"系列题目可在编程启蒙题库进行在线评测。
欢迎加入:Java、C++、Python技术交流QQ群(982860385),大佬免费带队,有问必答
欢迎加入:C++ GESP/CSP认证学习QQ频道,考试资源总结汇总
欢迎加入:C++ GESP/CSP学习交流QQ群(688906745),考试认证学员交流,互帮互助
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。