CSP-J 2024 第一轮 · 客观题精讲讲义

试卷:CSP 2024 入门级(Junior)第一轮 · 单项选择 + 阅读程序 + 完善程序

用法:先独立作答,再点「显示解析」核对分步推理;右上角可切换 浅色/深色 配色。

单选题 15 阅读程序 3 段 完善程序 2 段 共 42 个作答点 答案均经代码验证

🗺️ 本卷知识地图

CSP-J 入门级第一轮,覆盖基础常识与基本算法。本卷可归为 8 大板块。

① 数据类型与范围

Q1 int 范围、Q6 基本数据类型、Q8 字符与 ASCII。

② 进制与编码

Q2 多进制混合运算、Q4 格雷码、Q5 字节/位换算。

③ 组合计数

Q3 分部门选人、Q14 捆绑法排列。

④ 数据结构

Q11 图的度、Q12 二叉树遍历、Q13 栈的合法出栈序列。

⑤ 算法与查找

Q9 二分查找次数、Q15 编译器作用、Q7 循环语句、Q10 操作系统。

⑥ 阅读程序 ⭐

素数判断与统计、最小代价爬楼梯 DP、递归求值。

⑦ 完善程序 ⭐

判断完全平方数、汉诺塔递归。

⑧ 高频易错

循环边界 i*i<=n、递归闭式 a×(b+1)、出栈合法性、捆绑/插空。

第一部分 · 单项选择题(1–15)
第 1 题单选int 范围

32 位 int 类型的存储范围是( )?

第 2 题单选多进制运算

计算 (148 − 10102) × D16 − 11012 的十进制结果是( )?

第 3 题单选分类组合计数

10 名员工分为 A(4)、B(3)、C(3) 三个部门,选 4 人且每部门至少 1 人,有多少种选法?

第 4 题单选格雷码

以下哪个序列是数字 0~7 的 4 位二进制格雷码?

第 5 题单选字节/位换算

1KB=1024 字节,1MB=1024KB,那么 1MB 是多少二进制位(bit)?

第 6 题单选基本数据类型

以下哪个不是 C++ 中的基本数据类型?

第 7 题单选循环语句

以下哪个不是 C++ 中的循环语句?

第 8 题单选字符与 ASCII

在 C/C++ 中,(char)('a' + 13) 与下面哪个值相等?

第 9 题单选二分查找

有序表有 1000 个元素,用二分法查找 X 最多需要比较多少次?

第 10 题单选操作系统

下面哪一个不是操作系统的名字?

第 11 题单选图的度

在无向图中,所有顶点的度数之和等于( )。

第 12 题单选二叉树遍历还原

前序 [A,B,D,E,C,F,G]、中序 [D,B,E,A,F,C,G],则后序遍历是?

第 13 题单选合法出栈序列

依次入栈 1 2 3 4 5 6(1 先 6 后),下面哪种出栈顺序不可能

第 14 题单选捆绑法

5 个男生、3 个女生站一排,3 个女生必须相邻,有多少种排法?

第 15 题单选编译器

编译器的主要作用是什么?

第二部分 · 阅读程序

📄 阅读程序(一)· 素数判断与统计

判断题正确填「正确」、错误填「错误」。统计/求和 2~n 之间的素数。

bool isPrime(int n) {
    if (n <= 1) return false;
    for (int i = 2; i * i <= n; i++)        // 只需试到 √n
        if (n % i == 0) return false;
    return true;
}
int countPrimes(int n){ int c=0; for(int i=2;i<=n;i++) if(isPrime(i)) c++; return c; }
int sumPrimes(int n){ int s=0; for(int i=2;i<=n;i++) if(isPrime(i)) s+=i; return s; }
int main(){ int x; cin>>x; cout<<countPrimes(x)<<" "<<sumPrimes(x)<<endl; }
16-判1判断

当输入为 10 时,第一个输出为 4,第二个输出为 17。

16-判2判断

若将 isPrime 中条件 i*i<=n 改为 i<=n/2,输入 20 时 countPrimes(20) 变为 6。

16-判3判断

sumPrimes 函数计算的是从 2 到 n 之间所有素数之和。

16-选1单选

当输入为 50 时,sumPrimes(50) 的输出为?

16-选2单选

若将 for(int i=2;i*i<=n;i++) 改为 for(int i=2;i<=n;i++),输入 10 时程序的输出?

📄 阅读程序(二)· 最小代价爬楼梯(DP)

dp[i] = 到达第 i 阶的最小花费,可从 i−1 或 i−2 上来;最终可停在第 n 或 n−1 阶。

int compute(vector<int>& cost) {
    int n = cost.size();
    vector<int> dp(n+1, 0);
    dp[1] = cost[0];
    for (int i = 2; i <= n; i++)
        dp[i] = min(dp[i-1], dp[i-2]) + cost[i-1];   // 从前一阶或前两阶上来
    return min(dp[n], dp[n-1]);                       // 终点可停 n 或 n-1
}
17-判1判断

当 cost = {10, 15, 20} 时,程序输出 15。

17-判2判断

如果将 dp[i-1] 改为 dp[i-3],程序可能会产生编译错误。

17-判3判断2 分

程序总是输出 cost 数组中最小的元素。

17-选1单选

当 cost = {1,100,1,1,1,100,1,1,100,1} 时,程序输出?

17-选2单选4 分

当 cost = {10,15,30,5,5,10,20} 时,程序输出?

17-选3单选

若将 min(dp[i-1],dp[i-2])+cost[i-1] 改为 dp[i-1]+cost[i-2],cost = {5,10,15} 时输出?

📄 阅读程序(三)· 递归求值

customFunction(a,b) 递归累加;main 输出 pow(result, 2)。关键闭式:customFunction(a,b) = a×(b+1)。

int customFunction(int a, int b) {
    if (b == 0) return a;
    return a + customFunction(a, b - 1);   // 累加 (b+1) 个 a
}
int main(){ int x,y; cin>>x>>y; cout<<pow(customFunction(x,y), 2)<<endl; }
18-判1判断

当输入为 2 3 时,customFunction(2, 3) 的返回值为 64。

18-判2判断错题

当 b 为负数时,customFunction(a,b) 会陷入无限递归。(错题:同时选「正确」和「错误」均得分)

18-判3判断错题

当 b 的值越大,程序的运行时间越长。(错题:同时选「正确」和「错误」均得分)

18-选1单选

当输入为 5 4 时,customFunction(5, 4) 的返回值为?

18-选2单选

如果输入 x=3、y=3,则程序的最终输出为?

18-选3单选4 分

若将递归改为 return a + customFunction(a-1, b-1);,输入 3 3,最终输出为?

第三部分 · 完善程序(单选)

🧩 完善程序(一)· 判断完全平方数

给定正整数 num,判断是否存在正整数 x 使 x²=num。在 1~⌊√num⌋ 范围内枚举 i,看 i²是否等于 num。补全 ①~⑤。

bool isSquare(int num) {
    int i = __①__;
    int bound = __②__;
    for (; i <= bound; ++i) {
        if (__③__) return __④__;
    }
    return __⑤__;
}
19-①完善

① 处应填?

19-②完善

② 处(枚举上界 bound)应填?

19-③完善

③ 处(判定条件)应填?

19-④完善

④ 处(找到时返回什么)应填?(找到平方根时)

19-⑤完善

⑤ 处(循环结束后返回)应填?

🧩 完善程序(二)· 汉诺塔

dfs(i, src, tmp, tgt) 表示把 i 个盘从 src 经 tmp 移到 tgt。补全 ①~⑤。

void move(char src, char tgt){ cout<<"从柱子"<<src<<"挪到柱子"<<tgt<<endl; }
void dfs(int i, char src, char tmp, char tgt) {
    if (i == __①__) { move(__②__); return; }   // 只剩 1 个盘
    dfs(i - 1, __③__);    // 先把上面 i-1 个挪到 tmp
    move(src, tgt);            // 最大盘 src → tgt
    dfs(__⑤__, __④__);    // 再把 i-1 个从 tmp 挪到 tgt
}
int main(){ int n; cin>>n; dfs(n, 'A', 'B', 'C'); }
20-①完善

① 处(递归边界)应填?

20-②完善

② 处(边界时的移动)应填?

20-③完善

③ 处(第一次递归的参数)应填?

20-④完善

④ 处(第二次递归的柱子参数)应填?

20-⑤完善

⑤ 处(第二次递归的盘数)应填?