1 条题解
-
0
以下是 2024 年 CSP-J 第一轮试题的详细解答与解析:
一、 单项选择题
1. 答案:C
解析:32 位有符号整数(int)使用补码表示,其取值范围是 到 ,即 到 。2. 答案:A
解析:先将所有数转换为十进制:- 代入计算:$(12 - 10) \times 13 - 13 = 2 \times 13 - 13 = 26 - 13 = 13_{10}$。
3. 答案:B
解析:从 10 人中选 4 人,且每个部门至少 1 人,共有 3 种人员分配情况:- A部门2人,B部门1人,C部门1人:$C_4^2 \times C_3^1 \times C_3^1 = 6 \times 3 \times 3 = 54$ 种
- A部门1人,B部门2人,C部门1人:$C_4^1 \times C_3^2 \times C_3^1 = 4 \times 3 \times 3 = 36$ 种
- A部门1人,B部门1人,C部门2人:$C_4^1 \times C_3^1 \times C_3^2 = 4 \times 3 \times 3 = 36$ 种 总方式 = 种。
4. 答案:D
解析:4 位格雷码的特点是相邻两个码字只有一位不同。0 到 7 的标准格雷码序列为:0000, 0001, 0011, 0010, 0110, 0111, 0101, 0100。(注:题目中“0至8”应为笔误,实际选项给出的是 0 至 7 共 8 个状态的格雷码)。5. 答案:D
解析:$1 \text{ MB} = 1024 \text{ KB} = 1024 \times 1024 \text{ Byte} = 1048576 \text{ Byte}$。
,所以 $1 \text{ MB} = 1048576 \times 8 = 8388608 \text{ bit}$。6. 答案:C
解析:C++ 的基本数据类型包括int,float,char,double,bool等。struct是构造类型(或复合类型),不属于基本数据类型。7. 答案:D
解析:C++ 中的循环语句有for,while,do-while。repeat-until是 Pascal 等语言中的循环语句,C++ 中没有。8. 答案:B
解析:字符 'a' 的 ASCII 码值为 97。。ASCII 码 110 对应的字符是 'n'('m' 是 109,'n' 是 110)。9. 答案:B
解析:二分查找的最大比较次数为 。对于 ,,向上取整为 10 次。10. 答案:A
解析:Notepad(记事本)是一个文本编辑器应用程序,不是操作系统。Linux, Windows, macOS 均为操作系统。11. 答案:B
解析:根据图论中的握手定理,无向图中所有顶点的度数之和等于边数的两倍(因为每条边为两个端点各贡献 1 度)。12. 答案:A
解析:根据前序遍历(根-左-右)和中序遍历(左-根-右)重建二叉树:- 前序首元素
A是根节点。 - 中序中
A将序列分为左子树D,B,E和右子树F,C,G。 - 左子树前序为
B,D,E,根为B;中序为D,B,E,故D是B的左孩子,E是B的右孩子。 - 右子树前序为
C,F,G,根为C;中序为F,C,G,故F是C的左孩子,G是C的右孩子。 后序遍历(左-右-根)结果为:D, E, B, F, G, C, A。
13. 答案:D
解析:模拟栈操作:- A: 1,2,3,4,5,6 全部入栈,然后依次出栈,可得 6,5,4,3,2,1。
- B: 1 入栈并出栈;2,3,4,5,6 入栈,然后依次出栈,可得 1,6,5,4,3,2。
- C: 1,2 入栈,2 出栈;3,4 入栈,4 出栈;5,6 入栈,6 出栈,5 出栈,3 出栈,1 出栈。可得 2,4,6,5,3,1。
- D: 1 入栈出栈;2,3 入栈,3 出栈;4,5 入栈,5 出栈。此时栈内从顶到底为 4, 2。下一个出栈的必须是 4,不可能是 2。故 D 不可能。
14. 答案:A
解析:使用捆绑法。将 3 个女生看作一个整体,与 5 个男生一起排列,共有 种排法。3 个女生内部有 种排法。总排列数 = 种。15. 答案:B
解析:编译器的主要作用是将高级语言编写的源代码翻译(转换)为计算机能够直接执行的机器代码(或目标代码)。
二、 阅读程序
(1) 素数统计
16. 答案:A (正确)
解析:10 以内的素数有 2, 3, 5, 7,共 4 个,它们的和为 。程序输出 "4 17",正确。17. 答案:B (错误)
解析:将i*i <= n改为i <= n/2只是扩大了判断素数时的循环上界。对于判断一个数是否为素数,只要上界 结果就是正确的。因此countPrimes(20)的结果依然是 8(2,3,5,7,11,13,17,19),不会变为 6。18. 答案:A (正确)
解析:sumPrimes函数遍历 2 到 ,调用isPrime判断,若是素数则累加到sum中,功能描述正确。19. 答案:B
解析:50 以内的素数有:2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47。共 15 个。它们的和为 328。20. 答案:B
解析:将循环条件改为i <= n,对于判断素数的逻辑结果没有影响(依然能正确判断),只是做了更多无用的循环,导致运行时间变长,但输出结果仍然是 "4" 和 "17"。(2) 最小花费爬楼梯
21. 答案:A (正确)
解析:cost = {10, 15, 20}。dp[1] = 10。dp[2] = min(10, 0) + 15 = 15。dp[3] = min(15, 10) + 20 = 30。返回min(dp[3], dp[2]) = min(30, 15) = 15。正确。22. 答案:B (错误)
解析:C++ 中vector的[]运算符不进行边界检查。当i=2时,dp[i-3]即dp[-1]会导致未定义行为(访问越界),但这通常是运行时错误,而不是编译错误。23. 答案:B (错误)
解析:程序计算的是到达顶部所需的最小花费,不一定等于数组中的最小元素。例如cost = {1, 100, 1},最小元素是 1,但程序输出为min(dp[3], dp[2]) = min(2, 100) = 2。24. 答案:A
解析:模拟 DP 过程:dp[0]=0,dp[1]=1,dp[2]=min(1,0)+100=100,dp[3]=min(100,1)+1=2,dp[4]=min(2,100)+1=3,dp[5]=min(3,2)+1=3,dp[6]=min(3,3)+100=103,dp[7]=min(103,3)+1=4,dp[8]=min(4,103)+1=5,dp[9]=min(5,4)+100=104,dp[10]=min(104,5)+1=6。返回min(6, 104) = 6。25. 答案:B
解析:cost = {10, 15, 30, 5, 5, 10, 20}。dp[1]=10,dp[2]=15,dp[3]=40,dp[4]=20,dp[5]=25,dp[6]=30,dp[7]=45。返回min(45, 30) = 30。26. 答案:A
解析:修改后dp[i] = dp[i-1] + cost[i-2]。cost = {5, 10, 15}。dp[1] = 5。i=2:dp[2] = dp[1] + cost[0] = 5 + 5 = 10。i=3:dp[3] = dp[2] + cost[1] = 10 + 10 = 20。 返回min(dp[3], dp[2]) = min(20, 10) = 10。(3) 递归与幂运算
27. 答案:B (错误)
解析:customFunction(2, 3)的计算过程为:$2 + \text{custom}(2, 2) = 2 + 2 + \text{custom}(2, 1) = 2 + 2 + 2 + \text{custom}(2, 0)$。当 时返回 (即 2)。所以总结果为 。题目说返回 64(64 是 main 函数中pow(8, 2)的结果),故描述错误。28. 答案:A (正确)
解析:当 为负数时,每次递归 减 1,会变得越来越小,永远无法达到基线条件 ,从而导致无限递归(最终栈溢出)。(注:原题标注为错题,但按逻辑陈述本身是正确的)29. 答案:A (正确)
解析: 的值越大,递归调用的深度越深,执行的加法操作次数越多,程序运行时间自然越长。(注:原题标注为错题,但按逻辑陈述本身是正确的)30. 答案:B
解析:customFunction(5, 4)的计算:$5 + \text{custom}(5, 3) = 5 + 5 + \text{custom}(5, 2) = 5 + 5 + 5 + \text{custom}(5, 1) = 5 + 5 + 5 + 5 + \text{custom}(5, 0)$。当 时返回 (即 5)。所以结果为 。31. 答案:C
解析:输入 。customFunction(3, 3)返回 。main 函数中输出pow(12, 2),即 。32. 答案:D
解析:修改为return a + customFunction(a-1, b-1);。输入 3, 3。custom(3, 3) = 3 + custom(2, 2)custom(2, 2) = 2 + custom(1, 1)custom(1, 1) = 1 + custom(0, 0)custom(0, 0):此时 ,返回 ,即 0。 所以custom(3, 3) = 3 + 2 + 1 + 0 = 6。最终输出pow(6, 2) = 36。
三、 完善程序
(1) 判断平方数
33. 答案:A
解析:判断完全平方数,应从最小的正整数 1 开始尝试,故 ① 填1。34. 答案:B
解析:只需遍历到 即可。floor(sqrt(num))向下取整得到整数上界,故 ② 填(int)floor(sqrt(num))。35. 答案:D
解析:判断当前 的平方是否等于num,故 ③ 填num == i * i。36. 答案:C
解析:如果找到了 使得 ,说明是完全平方数,应返回true。37. 答案:D
解析:如果循环结束都没有找到满足条件的 ,说明不是完全平方数,应返回false。(2) 汉诺塔问题
38. 答案:B
解析:递归的基线条件是只剩 1 个圆盘时,直接将其从源柱子移动到目标柱子,故 ① 填1。39. 答案:B
解析:当只剩 1 个圆盘时,直接从src移动到tgt,故 ② 填src, tgt。40. 答案:B
解析:第一步递归:将上面 个圆盘从src借助tgt移动到tmp。参数顺序为src, tgt, tmp。41. 答案:B
解析:第三步递归:将 个圆盘从tmp借助src移动到tgt。参数顺序为tmp, src, tgt。42. 答案:C
解析:递归移动的是 个圆盘,故 ⑤ 填i-1。
- 1
信息
- ID
- 7848
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 9
- 标签
- 递交数
- 462
- 已通过
- 20
- 上传者