ARTICLE · 994812
CSP-J 2024 第一轮真题及解析
点击名片 关注我们


进群领取CSP复习资料。

9月13日,上海交大教练直播课,13:00-15:00,C++信奥零基础新班开课。
1
单项选择


2
阅读程序
阅读程序(一)
#include<iostream>usingnamespacestd;boolisPrime(int n){if (n <= 1) {returnfalse; }for (int i = 2; i * i <= n; i++) {if (n % i == 0) {returnfalse; } }returntrue;}intcountPrimes(int n){int count = 0;for (int i = 2; i <= n; i++) {if (isPrime(i)) { count++; } }return count;}intsumPrimes(int n){int sum = 0;for (int i = 2; i <= n; i++) {if (isPrime(i)) { sum += i; } }return sum;}intmain(){int x;cin >> x;cout << countPrimes(x) << " " << sumPrimes(x) << endl;return0;}假设输入的所有数都为不超过 1000 的正整数,完成下面的判断题和单选题:
【题目分析】
判素数逻辑:试除到 (条件 i * i <= n)。
countPrimes(n):统计 的素数个数。
sumPrimes(n):求 的素数和。
判断题
当输入为“10”时,程序的第一个输出为“4”,第二个输出为“17”。
正确 错误
【答案】正确
【解析】
若将 isPrime(i) 函数种的条件改为 i<=n/2,输入“20”时,countPrimes(20) 的输出将变为“6”。
正确 错误
【答案】错误
【解析】
修改后循环范围(试除到 )虽然冗余,但不会改变正确性。
20 以内素数:2, 3, 5, 7, 11, 13, 17, 19 共 8 个,不会变成 6。
sumPrimes 函数计算的是从 2 到 n 之间的所有素数之和。
正确 错误
【答案】正确
【解析】
符合题意。
单选题
当输入为“50”时,sumPrimes(50) 的输出为( )。
A. 1060
B. 328
C. 381
D. 275
【答案】B
【解析】
50 以内素数:2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47,求和 328。
如果将 for(int i=2;i*i<=n;i++)改为for(int i=2;i<=n;i++),输入“10”时,程序的输出( )。
A. 将不能正确计算10以内素数个数及其和
B. 仍然输出“4”和“17”
C. 输出“3”和10
D. 输出结果不变,但运行时间更短
【答案】A
【解析】
修改后,当判断一个素数 n(如 2, 3, 5, 7)时,循环会走到 i == n,此时 n % n == 0,函数一直返回 false。
阅读程序(二)
#include<iostream>#include<vector>usingnamespacestd;intcompute(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]);}intmain(){int n;cin >> n;vector<int> cost(n);for (int i = 0; i < n; i++) {cin >> cost[i]; }cout << compute(cost) << endl;return0;}判断题
当输入的cost数组为{10,15,20}时,程序的输出为15。
正确 错误
【答案】正确
【解析】
计算:
dp[0]=0dp[1]=10i=2:dp[2]=min(10,0)+15=15i=3:dp[3]=min(15,10)+20=30答案:min(dp[3],dp[2])=min(30,15)=15。成立。
22.如果将dp[i-1]改为dp[i-3],程序可能会产生编译错误。
正确 错误
【答案】错误
【解析】
语法合法,依旧能编译;但运行时当 i=2、i=3 就会访问 dp[-1] 或 dp[-2](越界,未定义行为),不是“编译错误”。
(2分)程序总是输出cost数组种的最小的元素。
正确 错误
【答案】错误
【解析】
例:cost = {10,15,20},最小元素是 10,输出却是 15(组合路径的最优总费用,不等于单个最小值)。
单选题
当输入的 cost 数组为{1,100,1,1,1,100,1,1,100,1}时,程序的输出为( )。
A. 6
B. 7
C. 8
D. 9
【答案】A
【解析】
答案:min(dp[10], dp[9]) = min(6,104)=6。
(4分)如果输入的 cost 数组为{10,15,30,5,5,10,20},程序的输出为( )。
A. 25
B. 30
C. 35
D. 40
【答案】B
【解析】
答案:min(dp[7], dp[6]) = min(45,30)=30。
若将代码中的 min(dp[i-1],dp[i-2])+cost[i-1] 修改为 dp[i-1]+cost[i-2],输入 cost 数组为 {5,10,15} 时,程序的输出为( )。
A. 10
B. 15
C. 20
D. 25
【答案】A
【解析】
dp[0]=0dp[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。
阅读程序(三)
#include<iostream>#include<cmath>usingnamespacestd;intcustomFunction(int a, int b){if (b == 0) {return a; }return a + customFunction(a, b - 1);}intmain(){int x, y;cin >> x >> y;int result = customFunction(x, y);cout << pow(result, 2) << endl;return0;}【程序分析】
判断题
当输入为“2 3”时,customFunction(2,3)的返回值为“64”。
正确 错误
【答案】错误
【解析】
customFunction(2,3)=2*(3+1)=8;打印的是 。题干把函数返回值与最终输出混淆,所以错误。
当 b 为负数时,customFunction(a,b)理论上会陷入无限递归。
正确 错误
【答案】正确
【解析】
若 b<0,每次递归调用 b-1 继续变小,永远不会等于 0,导致栈溢出(无限递归)。
当 b 的值越大,程序的运行时间越长。
正确 错误
【答案】正确
【解析】
递归深度(调用次数)为 b 次(加上基例),时间复杂度 O(b),空间复杂度(调用栈)同为 O(b)。因此随 b 增长而线性变慢。
单选题
当输入为“5 4”时,customFunction(5,4) 的返回值为( )。
A. 5
B. 25
C. 250
D. 625
【答案】B
【解析】
如果输入x = 3 和 y = 3,则程序的最终输出为( )。
A. 27
B. 81
C. 144
D. 256
【答案】C
【解析】
(4分)若将customFunction函数改为“return a + customFunction(a-1,b-1);并输入“3 3”,则程序的最终输出为( )。
A. 9
B. 16
C. 25
D. 36
【答案】D
【解析】
f(3,3) = 3 + f(2,2)
f(2,2) = 2 + f(1,1)
f(1,1) = 1 + f(0,0)
f(0,0) = 0 // 因 b==0 返回 a(=0)
合计 = 3+2+1+0 = 6
输出 = = 36
4
完善程序


相关推荐

喜欢就“分享”一下吧~