选择题 共15道
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15阅读程序 共18道
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33完善程序 共10道
34 35 36 37 38 39 40 41 42 43795 2025年CCF CSP-J 第一轮入门级C++试卷-练习
选择题 共15道
01 一个 32 位无符号整数可以表示的最大值,最接近下列哪个选项? 2分
登录后查看选项
02 在C++中,执行int x = 255; cout << (x & (x - 1)); 后,输出的结果是? 2分
登录后查看选项
03
函数 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);
}
2分
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);
}
登录后查看选项
04 用5个权值 10,12,15,20,25 构造哈夫受树,该树的带权路径长度是多少? 2分
登录后查看选项
05 在一个有向图中,所有顶点的入度之和等于所有顶点的出度之和,这个总和等于? 2分
登录后查看选项
06 从5 位男生和 4 位女生中选出4人组成一个学习小组,要求学习小组中男生和女生都有。有多少种不同的选举方法? 2分
登录后查看选项
07 假设 a,b,c都是布尔变量,逻辑表达式 (a && b) || (!c && a) 的值与下列哪个表达式不始终相等? 2分
登录后查看选项
08 已知 f[0] = 1,f[1] = 1,并且对于所有 n ≥ 2 有 f[n] = (f[n-1] + f[n-2]) % 7 那么 f[2025] 的值是多少? 2分
登录后查看选项
09 下列关于C++ string 类的说法,正确的是? 2分
登录后查看选项
10
考虑以下函数
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);
}
在main 函数调用 solve 后,x 和 y 的值分别是?
2分
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);
}
登录后查看选项
11 一个 8x8 的棋盘,左上角坐标为(1,1),右下角为(8,8)。一个机器人从(1,1)出发,每次只能向右或向下走一格。要到达(4,5),有多少种不同的路径? 2分
登录后查看选项
12 某同学用冒泡排序对数组 {6,1,5,2,4} 进行升序排序,请问需要进行多少次元素交换? 2分
登录后查看选项
13 十进制数 720_10 和八进制数 270_8 的和用十六进制表示是多少? 2分
登录后查看选项
14 一棵包含 1000 个结点的完全二叉树,其叶子结点的数量是多少? 2分
登录后查看选项
15 给定一个初始为空的整数栈 S 和一个空的队列 P。我们按顺序处理输入的整数队列 A:7,5,8,3,1,4,2 。对于队列A中的每一个数,执行以下规则:如果该数是奇数,则将其压入栈S;如果该数是偶数,且栈S非空,则弹出一个栈顶元素,并加入到队列 P 的末尾;如果该数是偶数,且栈 S 为空,则不进行任何操作。当队列 A 中的所有数都处理完毕后,队列P的内容是什么? 2分
登录后查看选项
阅读程序 共18道
16
二、阅读程序(程序输入不超过数组或字符串定义的范围;判断题正确填√,错误填x;除特殊说明外,判断题1.5分,选择题3分,共计40分)
01 #include <algorithm>
02 #include <cstdio>
03 #include <cstring>
04 inline int gcd(int a, int b) {
05 if(b == 0)
06 return a;
07 return gcd(b, a % b);
08 }
09 int main() {
10 int n;
11 scanf("%d", &n);
12 int ans = 0;
13 for(int i=1; i<=n; ++i) {
14 for(int j=i+1; j<=n; ++j) {
15 for(int k=j+1; k<=n; ++k) {
16 if(gcd(i,j)==1 && gcd(j,k)==1 && gcd(i,k)==1) {
17 ++ans;
18 }
19 }
20 }
21 }
22 printf("%d\n",ans);
23 return 0;
24 }
(1分)当输入为2时,程序并不会执行第16行的判断语句。
1分
01 #include <algorithm>
02 #include <cstdio>
03 #include <cstring>
04 inline int gcd(int a, int b) {
05 if(b == 0)
06 return a;
07 return gcd(b, a % b);
08 }
09 int main() {
10 int n;
11 scanf("%d", &n);
12 int ans = 0;
13 for(int i=1; i<=n; ++i) {
14 for(int j=i+1; j<=n; ++j) {
15 for(int k=j+1; k<=n; ++k) {
16 if(gcd(i,j)==1 && gcd(j,k)==1 && gcd(i,k)==1) {
17 ++ans;
18 }
19 }
20 }
21 }
22 printf("%d\n",ans);
23 return 0;
24 }
登录后查看选项
17 将第 16 行中的 “&& gcd(i,k)==1” 删去不会形响程序运行结果。 1.5分
登录后查看选项
18 当输入的n≥3的时候,程序总是输出一个正整数。 1.5分
登录后查看选项
19 将第7行的 “gcd(b,a%b)” 改为 “gcd(a,a%b)” 后,程序可能出现的问题是( )。 3分
登录后查看选项
20 当输入为8的时候,输出为( )。 3分
登录后查看选项
21 调用 gcd(36,42)会返回( )。 3分
登录后查看选项
22
01 #include <algorithm>
02 #include <cstdio>
03 #include <cstring>
04 #define ll long long
05 int n, k;
06 int a[200007];
07 int ans[200007];
08 int main() {
09 scanf("%d%d",&n,&k);
10 for(int i=1; i<=n; ++i) {
11 scanf("%d", &a[i]);
12 }
13 std::sort(a+1, a+n+1);
14 n = std::unique(a+1, a+n+1)-a-1;
15 for(int i=1,j=0; i<=n; ++i) {
16 for(; j<i && a[i]-a[j+1]>k; ++j)
17 ;
18 ans[i]= ans[j]+1;
19 }
20 printf("%d\n", ans[n]);
21 return 0;
22 }
当输入为“3 1 3 2 1”时,输出结果为 2。
1.5分
01 #include <algorithm>
02 #include <cstdio>
03 #include <cstring>
04 #define ll long long
05 int n, k;
06 int a[200007];
07 int ans[200007];
08 int main() {
09 scanf("%d%d",&n,&k);
10 for(int i=1; i<=n; ++i) {
11 scanf("%d", &a[i]);
12 }
13 std::sort(a+1, a+n+1);
14 n = std::unique(a+1, a+n+1)-a-1;
15 for(int i=1,j=0; i<=n; ++i) {
16 for(; j<i && a[i]-a[j+1]>k; ++j)
17 ;
18 ans[i]= ans[j]+1;
19 }
20 printf("%d\n", ans[n]);
21 return 0;
22 }
登录后查看选项
23 假设输入的n为正整数,输出的答案一定小于等于 n,大于等于 1。 1.5分
登录后查看选项
24 将第 14 行的 “n=std::unique(a+1,a+n+1)-a-1;” 删去后,有可能出现与原本代码不同的输出结果。 1.5分
登录后查看选项
25 假设输入的 a数组和k均为正整数,执行第 18 行代码时,一定满足的条件不包括( )。 3分
登录后查看选项
26 当输入的 n=108、k=2、a={1,2,...,100}时,输出为( )。 3分
登录后查看选项
27 假设输入的 a数组和 k均为正整数,但a数组不一定有序,则若误删去第 13 行的 “std::sort(a+1,a+n+1):” ,程序有可能出现的问题有( ) 3分
登录后查看选项
28
01 #include <algorithm>
02 #include <cstdio>
03 #include<cstring>
04 #define ll long long
05 int f[5007][5007];
06 int a[5007],b[5007];
07 int n;
08 int main() {
09 scanf("%d",&n);
10 for(int i=1; i<=n; ++i) {
11 scanf("%d",&a[i]);
12 }
13 for(int i=1; i<=n; ++i) {
14 scanf("%d",&b[i]);
15 }
16 for(int i=1; i<=n; ++i) {
17 for(int j=1; j<=n; ++j) {
18 f[i][j] = std::max(f[i][j],std::max(f[i-1][j],f[i][j-1]));
19 if(a[i] == b[j]) {
20 f[i][j]=std::max(f[i][j],f[i-1][j- 1]+ 1);
21 }
22 }
23 }
24 printf("%d\n",f[n][n]);
25 return 0;
26 }
当输入 “4 1 2 3 4 1 3 2 2” 时,输出为 2。
1.5分
01 #include <algorithm>
02 #include <cstdio>
03 #include<cstring>
04 #define ll long long
05 int f[5007][5007];
06 int a[5007],b[5007];
07 int n;
08 int main() {
09 scanf("%d",&n);
10 for(int i=1; i<=n; ++i) {
11 scanf("%d",&a[i]);
12 }
13 for(int i=1; i<=n; ++i) {
14 scanf("%d",&b[i]);
15 }
16 for(int i=1; i<=n; ++i) {
17 for(int j=1; j<=n; ++j) {
18 f[i][j] = std::max(f[i][j],std::max(f[i-1][j],f[i][j-1]));
19 if(a[i] == b[j]) {
20 f[i][j]=std::max(f[i][j],f[i-1][j- 1]+ 1);
21 }
22 }
23 }
24 printf("%d\n",f[n][n]);
25 return 0;
26 }
登录后查看选项
29 当程序运行完毕后,对于所有的 1≤i,j≤n,都一定有 f[i][j]<=f[n][n]。 1.5分
登录后查看选项
30 将第 18 行的 “f[i][j]=std::max(f[i][j],std::max(f[1-1][j],f[1][j-1]));” 删去后,并不影响程序运行结果。 1.5分
登录后查看选项
31 输出的答案满足的性质有( )。 3分
登录后查看选项
32 如果在 16 行的循环前加上以下两行:“std::sort(a+1,a+n+1);std::sort(b+1,b+n+1)”,则答案会( )。 3分
登录后查看选项
33 如果输入的 a={1,2,...,n},而且 b 数组中数字均为 1~n 中的正整数,则上述代码等价于下面哪个问题:( )。 3分
登录后查看选项
完善程序 共10道
34
(字符串解码)“行程长度编码”(Run-Length Encoding)是一种无损压缩算法,常用于压缩重复字符较多的数据,以减少存储空间。假设原始字符串不包含数字字符。压缩规则如下:i)如果原始字符串中一个字符连续出现N次(N≥2),在压缩字符串中它被表示为“字符+数字 N”。例如,编码“A12”代表12个连续的字符A。ii)如果原始字符串中一个字符只出现1次,在压缩字符串中它就表示为该字符本身。例如,编码“B”代表1个字符 B。
以下程序实现读取压缩字符串并输出其原始的、解压后的形式。试补全程序。
01 #include <cctype>
02 #include <iostream>
03 #include <string>
04 using namespace std;
05
06 int main() {
07 string z;
08 cin >> z;
09 string s="";
10
11 for(int i=0; i<z.length();) {
12 char ch = z[i];
13
14 if(__①__ && isdigit(z[i+1])) {
15 i++;
16 int count = 0;
17 while(i<z.length() && isdigit(z[i])) {
18 count = __②__;
19 i++;
20 }
21 for(int j=0; j< __③__ ; ++j) {
22 s += ch;
23 }
24 } else {
25 s += __④__;
26 __⑤__;
27 }
28 }
29
30 cout<<s<<endl;
31 return 0;
32 }
①处应填( )
3分
01 #include <cctype>
02 #include <iostream>
03 #include <string>
04 using namespace std;
05
06 int main() {
07 string z;
08 cin >> z;
09 string s="";
10
11 for(int i=0; i<z.length();) {
12 char ch = z[i];
13
14 if(__①__ && isdigit(z[i+1])) {
15 i++;
16 int count = 0;
17 while(i<z.length() && isdigit(z[i])) {
18 count = __②__;
19 i++;
20 }
21 for(int j=0; j< __③__ ; ++j) {
22 s += ch;
23 }
24 } else {
25 s += __④__;
26 __⑤__;
27 }
28 }
29
30 cout<<s<<endl;
31 return 0;
32 }
登录后查看选项
35 ②处应填( ) 3分
登录后查看选项
36 ③处应填( ) 3分
登录后查看选项
37 ④处应填( ) 3分
登录后查看选项
38 ⑤处应填( ) 3分
登录后查看选项
39
(精明与糊涂)有N个人,分为两类:i)精明人:永远能正确判断其他人是精明还是糊涂;ii)糊涂人:判断不可靠,会给出随机的判断。已知精明人严格占据多数,即如果精明人有 k 则满足 k > N/2。
你只能通过函数 query(i, j)让第i个人判断第j个人:返回 true 表示判断结果为“精明人”;返回 false 表示判断结果为“糊涂人”。你的目标是,通过这些互相判断,找出至少一个百分之百能确定的精明人。同时,你无需关心 query(i, j)的内部实现。
以下程序利用“精明人占多数”的优势。设想一个“消除”的过程,让人们互相判断并进行抵消。经过若干轮抵消后,最终留下的候选者必然属于多数派,即精明人。
例如,假设有三个人 0、1、2。如果0说1是糊涂人,而1也说0是糊涂人,则0和1至少有一个是糊涂人。程序将同时淘汰0和1。由于三人里至少有两个精明人,我们确定2是精明人。
试补全程序。
01 #include <iostream>
02 #include <vector>
03 using namespace std;
04
05 int N;
06 bool query(int i, int j);
07
08 int main() {
09 cin >> N;
10
11 int candidate = 0;
12 int count = __①__;
13
14 for(int i=1; i<N; ++i) {
15 if (__②__) {
16 candidate = i;
17 count = 1;
18 } else {
19 if(__③__) {
20 __④__
21 } else {
22 count++;
23 }
24 }
25 }
26
27 cout<<__⑤__<<endl;
28 return 0;
29 }
①处应填( )
3分
01 #include <iostream>
02 #include <vector>
03 using namespace std;
04
05 int N;
06 bool query(int i, int j);
07
08 int main() {
09 cin >> N;
10
11 int candidate = 0;
12 int count = __①__;
13
14 for(int i=1; i<N; ++i) {
15 if (__②__) {
16 candidate = i;
17 count = 1;
18 } else {
19 if(__③__) {
20 __④__
21 } else {
22 count++;
23 }
24 }
25 }
26
27 cout<<__⑤__<<endl;
28 return 0;
29 }
登录后查看选项
40 ②处应填( ) 3分
登录后查看选项
41 ③处应填( ) 3分
登录后查看选项
42 ④处应填( ) 3分
登录后查看选项
43 ⑤处应填( ) 3分
登录后查看选项