1 条题解

  • 0
    @ 2026-8-20 22:38:06

    以下是 2024 年 CSP-J 第一轮试题的详细解答与解析:


    一、 单项选择题

    1. 答案:C
    解析:32 位有符号整数(int)使用补码表示,其取值范围是 231-2^{31}23112^{31}-1,即 2147483648-2147483648+2147483647+2147483647

    2. 答案:A
    解析:先将所有数转换为十进制:

    • 148=1×8+4=121014_8 = 1 \times 8 + 4 = 12_{10}
    • 10102=8+2=10101010_2 = 8 + 2 = 10_{10}
    • D16=1310D_{16} = 13_{10}
    • 11012=8+4+1=13101101_2 = 8 + 4 + 1 = 13_{10} 代入计算:$(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$ 种 总方式 = 54+36+36=12654 + 36 + 36 = 126 种。

    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 Byte=8 bit1 \text{ Byte} = 8 \text{ bit},所以 $1 \text{ MB} = 1048576 \times 8 = 8388608 \text{ bit}$。

    6. 答案:C
    解析:C++ 的基本数据类型包括 int, float, char, double, bool 等。struct 是构造类型(或复合类型),不属于基本数据类型。

    7. 答案:D
    解析:C++ 中的循环语句有 for, while, do-whilerepeat-until 是 Pascal 等语言中的循环语句,C++ 中没有。

    8. 答案:B
    解析:字符 'a' 的 ASCII 码值为 97。97+13=11097 + 13 = 110。ASCII 码 110 对应的字符是 'n'('m' 是 109,'n' 是 110)。

    9. 答案:B
    解析:二分查找的最大比较次数为 log2(n+1)\lceil \log_2(n+1) \rceil。对于 n=1000n=1000log2(1001)9.96\log_2(1001) \approx 9.96,向上取整为 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,故 DB 的左孩子,EB 的右孩子。
    • 右子树前序为 C,F,G,根为 C;中序为 F,C,G,故 FC 的左孩子,GC 的右孩子。 后序遍历(左-右-根)结果为: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 个男生一起排列,共有 6!6! 种排法。3 个女生内部有 3!3! 种排法。总排列数 = 6!×3!=720×6=43206! \times 3! = 720 \times 6 = 4320 种。

    15. 答案:B
    解析:编译器的主要作用是将高级语言编写的源代码翻译(转换)为计算机能够直接执行的机器代码(或目标代码)。


    二、 阅读程序

    (1) 素数统计

    16. 答案:A (正确)
    解析:10 以内的素数有 2, 3, 5, 7,共 4 个,它们的和为 2+3+5+7=172+3+5+7=17。程序输出 "4 17",正确。

    17. 答案:B (错误)
    解析:将 i*i <= n 改为 i <= n/2 只是扩大了判断素数时的循环上界。对于判断一个数是否为素数,只要上界 n\ge \sqrt{n} 结果就是正确的。因此 countPrimes(20) 的结果依然是 8(2,3,5,7,11,13,17,19),不会变为 6。

    18. 答案:A (正确)
    解析sumPrimes 函数遍历 2 到 nn,调用 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] = 10dp[2] = min(10, 0) + 15 = 15dp[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] = 5i=2: dp[2] = dp[1] + cost[0] = 5 + 5 = 10i=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)$。当 b=0b=0 时返回 aa(即 2)。所以总结果为 2+2+2+2=82+2+2+2 = 8。题目说返回 64(64 是 main 函数中 pow(8, 2) 的结果),故描述错误。

    28. 答案:A (正确)
    解析:当 bb 为负数时,每次递归 bb 减 1,会变得越来越小,永远无法达到基线条件 b=0b=0,从而导致无限递归(最终栈溢出)。(注:原题标注为错题,但按逻辑陈述本身是正确的)

    29. 答案:A (正确)
    解析bb 的值越大,递归调用的深度越深,执行的加法操作次数越多,程序运行时间自然越长。(注:原题标注为错题,但按逻辑陈述本身是正确的)

    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)$。当 b=0b=0 时返回 aa (即 5)。所以结果为 5×5=255 \times 5 = 25

    31. 答案:C
    解析:输入 x=3,y=3x=3, y=3customFunction(3, 3) 返回 3×(3+1)=123 \times (3 + 1) = 12。main 函数中输出 pow(12, 2),即 122=14412^2 = 144

    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):此时 b=0b=0,返回 aa,即 0。 所以 custom(3, 3) = 3 + 2 + 1 + 0 = 6。最终输出 pow(6, 2) = 36


    三、 完善程序

    (1) 判断平方数

    33. 答案:A
    解析:判断完全平方数,应从最小的正整数 1 开始尝试,故 ① 填 1

    34. 答案:B
    解析:只需遍历到 num\sqrt{num} 即可。floor(sqrt(num)) 向下取整得到整数上界,故 ② 填 (int)floor(sqrt(num))

    35. 答案:D
    解析:判断当前 ii 的平方是否等于 num,故 ③ 填 num == i * i

    36. 答案:C
    解析:如果找到了 ii 使得 i×i=numi \times i = num,说明是完全平方数,应返回 true

    37. 答案:D
    解析:如果循环结束都没有找到满足条件的 ii,说明不是完全平方数,应返回 false

    (2) 汉诺塔问题

    38. 答案:B
    解析:递归的基线条件是只剩 1 个圆盘时,直接将其从源柱子移动到目标柱子,故 ① 填 1

    39. 答案:B
    解析:当只剩 1 个圆盘时,直接从 src 移动到 tgt,故 ② 填 src, tgt

    40. 答案:B
    解析:第一步递归:将上面 i1i-1 个圆盘从 src 借助 tgt 移动到 tmp。参数顺序为 src, tgt, tmp

    41. 答案:B
    解析:第三步递归:将 i1i-1 个圆盘从 tmp 借助 src 移动到 tgt。参数顺序为 tmp, src, tgt

    42. 答案:C
    解析:递归移动的是 i1i-1 个圆盘,故 ⑤ 填 i-1

    • 1

    【历年试卷】CSP 2024 入门级第一轮(ok)

    信息

    ID
    7848
    时间
    1000ms
    内存
    256MiB
    难度
    9
    标签
    递交数
    462
    已通过
    20
    上传者