2025年csp-j真题和解析
题目1
题目内容
一个 32 位无符号整数可以表示的最大值,最接近下列哪个选项?
选项
- A.
- B.
- C.
- D.
解析
解析: 对于位无符号整数,其取值范围是。无符号整数的每一位仅表示“0”或“1”,最大值对应“所有位均为1”的情况,此时数值为(二进制“全1”转十进制的公式)。,约,与最接近。
题目2
题目内容
在 C++ 中,执行int x = 255; cout << (x & (x - 1));
后,输出的结果是?
选项
- A. 255
- B. 254
- C. 128
- D. 0
解析
解析: 255 转化成二进制为11111111
,,转化为二进制是11111110
,进行按位与操作之后为11111110
,即 254。
题目3
题目内容
函数calc(n)
的定义如下,则calc(5)
的返回值是多少?
cpp
int calc(int n) {if (n <= 1) return 1;if (n % 2 == 0) return calc(n / 2) + 1;else return calc(n - 1) + calc(n - 2);
}
选项
- A. 5
- B. 6
- C. 7
- D. 8
解析
解析: 将代入计算:,所以,
因此,,返回值为 6。
题目4
题目内容
用 5 个权值 10,12,15,20,25 构造哈夫曼树,该树的带权路径长度是多少?
选项
- A. 176
- B. 186
- C. 196
- D. 286
解析
解析: 根据哈夫曼树的构造原理,使用权值 10、12、15、20、25 构造哈夫曼树的过程如下:
- 合并最小的两个权值 10 和 12,得到新节点 22。此时节点列表为 15、20、22、25。
- 合并最小的两个权值 15 和 20,得到新节点 35。此时节点列表为 22、25、35。
- 合并最小的两个权值 22 和 25,得到新节点 47。此时节点列表为 35、47。
- 合并最后两个节点 35 和 47,得到根节点 82。
计算带权路径长度(WPL),即每个叶节点的权值乘以其深度(从根到该节点的边数)之和:
- 节点 10 的深度为 3,贡献
- 节点 12 的深度为 3,贡献
- 节点 15 的深度为 2,贡献
- 节点 20 的深度为 2,贡献
- 节点 25 的深度为 2,贡献
,结果为 186。
题目5
题目内容
在一个有向图中,所有顶点的入度之和等于所有顶点的出度之和,这个总和等于?
选项
- A. 顶点数
- B. 边数
- C. 顶点数 + 边数
- D. 顶点数 × 2
解析
解析: 在有向图中,每条边都有一个起点和一个终点,因此每条边都会贡献一个出度(对于起点顶点)和一个入度(对于终点顶点)。所有顶点的入度之和等于所有顶点的出度之和,并且这个值都等于图中的 边数。
题目6
题目内容
从 5 位男生和 4 位女生中选出 4 人组成一个学习小组,要求学习小组中男生和女生都有,有多少种不同的选举方法?
选项
- A. 126
- B. 121
- C. 120
- D. 100
解析
解析: 可通过“1 男 3 女、2 男 2 女、3 男 1 女”三种符合条件的情况直接求和:
- 1 男 3 女:
- 2 男 2 女:
- 3 男 1 女:
总和:,不同的选举方法有 120 种。
题目7
题目内容
假设,,都是布尔变量,逻辑表达式的值与下列哪个表达式不始终相等?
选项
- A.
- B.
- C.
- D.
解析
解析: 原表达式为:。根据逻辑分配律,观察到两项均含公共因子,可提取简化:原表达式。
- 选项 A:与简化后的原表达式完全一致,始终等价,排除 A。
- 选项 B:。先利用幂等律,简化,表达式变为;再利用吸收律,简化为,与原表达式一致,排除 B。
- 选项 C:。原表达式简化后为,两者结构不同。反例:,,时,原表达式,选项 C,不始终等价。
- 选项 D:。利用德摩根定律,简化,表达式变为,与原表达式一致,排除 D。
答案为 C。
题目8
题目内容
已知,,并且对于所有有,那么的值是多少?
选项
- A. 2
- B. 4
- C. 5
- D. 6
解析
解析: 题目给出的数列是斐波那契数列的变形,满足:
- 初始项:,
- 递推式:(对 7 取模,数值范围 0-6)
由于斐波那契数列的状态由连续两项决定,当某一对连续项与初始项再次重复时,数列循环。计算可得:当时,,即数列周期为 16。
余 9,因此。计算得,故。
题目9
题目内容
下列关于 C++ string类的说法,正确的是?
选项
- A. string对象的长度在创建后不能改变
- B. 可以使用+运算符直接连接一个string对象和一个char类型的字符
- C. string的length()和size()方法返回的值可能不同
- D. string对象必须以'\0'结尾,且这个结尾符计入length()
解析
解析:
- 选项 A:错误。string对象长度可通过append()、insert()、erase()等操作改变。
- 选项 B:正确。C++ string类重载了+运算符,支持string对象与char字符直接连接。
- 选项 C:错误。length()和size()方法均返回字符串的字符数,始终相同。
- 选项 D:错误。string对象不一定以'\0'结尾,且length()不计入结尾符。
答案为 B。
题目10
题目内容
考虑以下 C++ 函数:
cpp
void solve(int &a, int b) {a = a + b;b = a - b;a = a - b;
}
int main() {int x = 5, y = 10;solve(x, y);
}
在main函数调用solve后,和的值分别是?
选项
- A. 5,10
- B. 10,5
- C. 10,10
- D. 5,5
解析
解析: solve函数中,第一个参数a
为传引用(修改会影响实参),第二个参数b
为传值(修改不影响实参)。
- 初始:(传引用给
a
),(传值给b
)。 - 执行
a = a + b
:(此时)。 - 执行
b = a - b
:(b
局部变量,不影响)。 - 执行
a = a - b
:(此时)。
最终,,,答案为 C。
题目11
题目内容
一个的棋盘,左上角坐标为,右下角为。一个机器人从出发,每次只能向右或向下走一格,要到达,有多少种不同的路径?
选项
- A. 20
- B. 35
- C. 56
- D. 70
解析
解析: 机器人从到,需计算必要步数:
- 向下步数:横坐标从1到4,需步;
- 向右步数:纵坐标从1到5,需步;
- 总步数:步,路径数等价于从7步中选3步向下(或4步向右)的组合数。
组合数公式:,代入,:
不同路径有 35 种,答案为 B。
题目12
题目内容
某同学用冒泡排序对数组进行升序排序,请问需要进行多少次元素交换?
选项
- A. 5
- B. 6
- C. 7
- D. 8
解析
解析: 冒泡排序中,元素交换次数等于数组的逆序对数量。逆序对是指数组中前面元素大于后面元素的成对组合。
数组的逆序对为:、、、、、,共 6 个逆序对。
因此,需要交换 6 次,答案为 B。
题目13
题目内容
十进制数和八进制数的和用十六进制表示是多少?
选项
- A.
- B.
- C.
- D.
解析
解析: 解题分三步:
- 八进制转十进制:按位权展开:。
计算两数之和:。
- 十进制转十六进制:除 16 取余:余;余;余。逆序排列余数:。
结果为 A。
题目14
题目内容
一棵包含 1000 个结点的完全二叉树,其叶子结点的数量是多少?
选项
- A. 499
- B. 512
- C. 500
- D. 501
解析
解析: 完全二叉树的叶子结点数计算公式:若总结点数为偶数,则叶子结点数;若为奇数,则叶子结点数(本质是“叶子结点数 = 总结点数 - 非叶子结点数”,非叶子结点数为)。
本题(偶数),叶子结点数,答案为 C。
题目15
题目内容
给定一个初始为空的整数栈和一个空的队列。按顺序处理输入队列,规则如下:①若数为奇数,压入栈;②若数为偶数且栈非空,弹出栈顶元素加入队列;③若数为偶数且栈为空,不操作。处理完所有数后,队列的内容是?
选项
- A. 5,1,3
- B. 7,5,3
- C. 3,1,5
- D. 5,1,3,7
解析
解析: 按队列顺序逐元素处理:
- 7(奇数):压入,,;
- 5(奇数):压入,,;
- 8(偶数,非空):弹出5加入,,;
- 3(奇数):压入,,;
- 1(奇数):压入,,;
- 4(偶数,非空):弹出1加入,,;
- 2(偶数,非空):弹出3加入,,。
最终队列的内容为 5,1,3,答案为 A。