#360. CSP 2025 入门级第一轮
CSP 2025 入门级第一轮
- 一个32位无符号整数可以表示的最大值,最接近下列哪个选项?( ) {{ select(1) }}
- 4×10^9
- 3×10^10
- 2×10^9
- 2×10^10
2.在C++中,执行int x=255;cout<(×&(x-1));后,输出的结果是?( ) {{ select(2) }}
- 255
- 254
- 128
- 0
3.函数calc(n)的定义如下,则calc(5)的返回值是多少?( )
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);
}
{{ select(3) }}
- 5
- 6
- 7
- 8
4.用5个权值10,12,15,28,25构造哈夫曼树,该树的带权路径长度是多少?( ) {{ select(4) }}
- 176
- 186
- 196
- 206
5.在一个有向图中,所有顶点的入度之和等于所有顶点的出度之和,这个总和等于?( ) {{ select(5) }}
- 顶点数
- 边数
- 顶点数+边数
- 顶点数*2
- 从5位男生和4位女生中选出4人组成一个学习小组,要求学习小组中男生和女生都有。有多少种不同的选举方法?( ) {{ select(6) }}
- 126
- 121
- 120
- 100
7.假设a,b,c都是布尔变量,逻辑表达式(a&&b)||(Ic&&a)的值与下列哪个表达式不始终相等?( ) {{ select(7) }}
- a && (b || !c)
- (a || !c) && (b || !c) && (a || a)
- a && (!b || c)
- (!a || !b) || (a && !c)
8.已知 f[0]=1, f[1]=1,f[n]=(f[n-1]+f[n-2])%7,求 f[2025]。 {{ select(8) }}
- 2
- 4
- 5
- 6
9.下列关于 C++ string 的说法正确的是? {{ select(9) }}
- 长度固定
- 可用 + 连接 string 和 char
- length() 与 size() 可能不同
- 必须以 \0 结尾且计入长度
10.调用后 x,y 的值?( )
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);
}
{{ select(10) }}
- 5,10
- 10,5
- 10,10
- 5,5
- 一个 8x8 的棋盘,左上角坐标为(1,1),右下角为(8,8)。一个机器人从(1,1)出发,每次只能向右或向下走一格。要到达(4,5),有多少种不同的路径? {{ select(11) }}
- 20
- 35
- 56
- 78
12.某同学用冒泡排序对数组{6,1,5,2,4}进行升序排序,请问需要进行多少次元素交换?( ) {{ select(12) }}
- 5
- 6
- 7
- 8
13.十进制数 72010和八进制数 2708。的和用十六进制表示是多少?() {{ select(13) }}
- 38816
- 3DE16
- 28816
- 99016
14.一棵包含 1000 个结点的完全二叉树,其叶子结点的数量是多少?()
{{ select(14) }}
- 499
- 512
- 500
- 501
15.给定一个初始为空的整数栈S和一个空的队列P。我们按顺序处理输入的整数队列A:7,5,8,3,1,4,2。对于队列A中的每一个数,执行以下规则:如果该数是奇数,则将其压入栈S:如果该数是偶数,且栈S非空,则弹出一个栈顶元素,并加入到队列P的末尾:如果该数是偶数,且栈s为空,则不进行任何操作。当队列A中的所有数都处理完毕后,队列P的内容是什么?() {{ select(15) }}
- 5,1,3
- 7,5,3
- 3,1,5
- 5,1,3,7
二、阅读程序(程序输入不超过数组或字符串定义的范围:判断题正确填,错误填x;除特殊说明外,判断题1.5分,选择题3分,共计40分) 第 1 题
#include<algorithm>
#include<cstdio>
#include<cstring>
inline int gcd(int a,int b){
if(b==0)
return a;
return gcd(b,a%b);
}
int main() {
int n;
scanf("%d",&n);
int ans=0;
for(int i=1;i<=n;++i){
for(int j=i+1;j<=n;++j){
for(int k=j+1;;k<=n;++k){
if(gcd(i,j)==1 && gcd(j,k)==1 && gcd(i,k)==1){
++ans;
}
}
}
}
printf("%d\n",ans);
return 0;
}
1.当输入为2时,程序并不会执行第16行的判断语句。() {{ select(16) }}
- 正确
- 错误
2.将第16行中的“&& gcd(i,k)==1”删去不会影响程序运行结果。() {{ select(17) }}
- 正确
- 错误
3.sumPrimes 函数计算的是从2 到n 之间的所有素数之和。 {{ select(18) }}
- 正确
- 错误
4.当输入为50 时,sumPrimes(50) 的输出为( )。 {{ select(19) }}
- 1060
- 328
- 381
- 275
- 如果将 for (int i = 2; i * i <= n; i++) 改为 for (int i = 2; i <= n; i++),输入 10 时,程序的输出( )。 {{ select(20) }}
- 将不能正确计算10 以内素数个数及其和
- 仍然输出 4 和 17
- 输出3 和10
- 输出结果不变,但运行时间更短
第 2 题
1.当输入的 cost 数组为{10,15,20} 时,程序的输出为15。( )。( ) {{ select(21) }}
- 正确
- 错误
2.如果将 dp[i-1] 改为 dp[i-3],程序可能会产生编译错误。( ) {{ select(22) }}
- 正确
- 错误
3.(2 分)程序总是输出 cost 数组中最小的元素。( ) {{ select(23) }}
- 正确
- 错误
4.当输入的 cost 数组为{1,100,1,1,1,100,1,1,100,1} 时,程序的输出为( )。 {{ select(24) }}
- 6
- 7
- 8
- 9
5.(4 分)如果输入的 cost 数组为{10,15,30,5,5,10,20},程序的输出为( )。 {{ select(25) }}
- 25
- 30
- 35
- 40
6.若将代码中的 min(dp[i-1], dp[i-2]) + cost[i-1] 修改为 dp[i-1] + cost[i-2],输入 cost 数组为 {5,10,15} 时,程序的输出为( )。 {{ select(26) }}
- 10
- 15
- 20
- 25
第 3 题
#include <iostream>
#include <cmath>
using namespace std;
int customFunction(int a, int b) {
if (b == 0) {
return a;
}
return a + customFunction(a, b-1);
}
int main() {
int x, y;
cin >> x >> y;
int result = customFunction(x, y);
cout << pow(result, 2) << endl;
return 0;
}
1.当输入为 2 3 时,customFunction(2, 3) 的返回值为 64。( )。 {{ select(27) }}
- 正确
- 错误
2.当 b 为负数时,customFunction(a, b) 会陷入无限递归。( )。 {{ select(28) }}
- 正确
- 错误
3.当 b 的值越大,程序的运行时间越长。( )。 {{ select(29) }}
- 正确
- 错误
4.当输入为 5 4 时,customFunction(5, 4) 的返回值为( )。 {{ select(30) }}
- 5
- 25
- 250
- 625
5.如果输入 x=3 和 y=3,则程序的最终输出为( )。 {{ select(31) }}
- 27
- 81
- 144
- 256
6.若将 customFunction 函数改为 return a + customFunction(a-1, b-1);,并输入 3 3,则程序的最终输出为( ) {{ select(32) }}
- 9
- 16
- 25
- 36
三、完善程序(单选题,每小题 3 分,共计 30 分) 第 1 题 (判断平方数) 问题:给定一个正整数n,希望判断这个数是否为完全平方数,即存在一个正整数 x,使得x 的平方为n。
试补全程序。
#include<iostream>
#include<vector>
using namespace std;
bool isSquare(int num) {
int i = ___①___;
int bound = ___②___;
for (; i <= bound; ++i) {
if (___③___) {
return ___④___;
}
}
return___⑤___;
}
int main() {
int n;
cin >> n;
if (isSquare(n)) {
cout << n << " is a square number" << endl;
} else {
cout << n << " is not a square number" << endl;
}
return 0;
}
1.① 处应填( ) {{ select(33) }}
- 1
- 2
- 3
- 4
2.② 处应填( )。 {{ select(34) }}
- (int)floor(sqrt(num))-1
- (int)floor(sqrt(num))
- floor(sqrt(num/2))-1
- floor(sqrt(num/2))
3.③ 处应填( )。 {{ select(35) }}
- num = 2 * i
- num == 2 * i
- num = i * i
- num == i * i
4.④ 处应填( )。 {{ select(36) }}
- num = 2 * i
- num == 2 * i
- true
- false
5.⑤ 处应填( )。 {{ select(37) }}
- num = i * i
- num != i * i
- true
- false
第 2 题 (汉诺塔问题) 给定三根柱子,分别标记为 A、B 和 C。初始状态下,柱子 A 上有若干个圆盘,这些圆盘从上到下按从小到大的顺序排列。任务是将这些圆盘全部移到柱子 C 上,且必须保持原有顺序不变。在移动过程中,需要遵守以下规则:
只能从一根柱子的顶部取出圆盘,并将其放入另一根柱子的顶部。 每次只能移动一个圆盘。 小圆盘必须始终在大圆盘之上。 试补全程序。
#include <iostream>
#include <vector>
using namespace std;
void move(char src, char tgt) {
cout << "从柱子" << src << "挪到柱子" << tgt << endl;
}
void dfs(int i, char src, char tmp, char tgt) {
if (i == ___①___) {
move(___②___;
return;
}
dfs(i - 1, ___③___);
move(src, tgt);
dfs(___⑤___, ___④___);
}
int main() {
int n;
cin >> n;
dfs(n, 'A', 'B', 'C');
}
1.① 处应填( )。 {{ select(38) }}
- 0
- 1
- 2
- 3
2.② 处应填( )。 {{ select(39) }}
- src, tmp
- src, tgt
- tmp, tgt
- tgt, tmp
3.③ 处应填( ) {{ select(40) }}
- src, tmp, tgt
- src, tgt, tmp
- tgt, tmp, src
- tgt, src, tmp
4.④ 处应填( )。 {{ select(41) }}
- src, tmp, tgt
- tmp, src, tgt
- src, tgt, tmp
- tgt, src, tmp
5.⑤ 处应填( ) {{ select(42) }}
- 0
- 1
- i - 1
- i