试卷总分:100分


选择题 15题 30分

01 02 03 04 05 06 07 08 09 10 11 12 13 14 15


阅读程序 17题 40分

16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32


完善程序 10题 30分

33 34 35 36 37 38 39 40 41 42

E1040 计算机学会CSP-J/S -2026年CSP-J模拟卷-1-考试

选择题 共15道

01 启动计算机引导操作系统是将操作系统( )。 2分
登录后查看选项
02 Windows 9x 是一种( )操作系统。 2分
登录后查看选项
03 在 24×24 点阵的字模中,汉字“一”与“编”的字模占用字节数分别是( )。 2分
登录后查看选项
04 计算机的运算速度取决于给定时间内其处理器所能处理的数据量。处理器一次能处理的数据量称为字长。已知 64 位的奔腾处理器一次能处理 64 位,相当于( )字节。 2分
登录后查看选项
05 算式 (2047)10 - (3FF)16 + (2000)8 的结果是( )。 2分
登录后查看选项
06 计算机的运算速度可以用 MIPS 来描述,它的含义是( )。 2分
登录后查看选项
07 设栈 S 的初始状态为空,现有 5 个元素组成的序列 {1,2,3,4,5},对该序列在栈 S 上依次进行如下操作(从序列中的 1 开始,出栈后不再进栈):进栈、出栈、进栈、进栈、出栈、进栈、出栈、进栈、出栈。出栈的元素序列是( )。 2分
登录后查看选项
08 在有 n 个叶节点的哈夫曼树中,节点总数为( )。 2分
登录后查看选项
09 电线上停着两种鸟(A 和 B),可以看出相邻的两只鸟将电线划分为一个线段。这些线段可分为两类:一类是线段两端的鸟种类相同,另一类是线段两端的鸟种类不同。已知电线的两个端点处恰好停着种类相同的鸟,那么两端的鸟种类不同的线段数目一定是( )。 2分
登录后查看选项
10 从未排序序列中挑选元素,并将其依次放入已排序序列(初始时为空)的一端,这种排序方法称为( )。 2分
登录后查看选项
11 对于一棵满二叉树,若其叶节点数为 m、分支节点数为 L、总节点数为 n,则下列关系式恒成立的是( )。 2分
登录后查看选项
12 以下不是操作系统名字的是( )。 2分
登录后查看选项
13 以下不是个人计算机的硬件组成部分的是( )。 2分
登录后查看选项
14 已知元素 (8,25,14,87,51,90,6,19,20),这些元素以( )的顺序全部入栈,再全部出栈,可使栈的出栈顺序满足:8 在 51 之前;90 在 87 之后;20 在 14 之后;25 在 6 之前;19 在 90 之后。 2分
登录后查看选项
15 假设我们用向量 d = (a1,a2,···,a5) 表示无向连通图 G 的 5 个顶点的度数,下面给出的( )组 d 值合理。 2分
登录后查看选项

阅读程序 共17道

16
01 #include <iostream>
02 #include <cmath>
03 using namespace std;
04 bool IsPrime(int num) {
05     for (int i=2; i<=sqrt(num); i++) {
06         if (num % i == 0) return false;
07     }
08     return true;
09 }
10 int main() {
11     int num = 0;
12     cin >> num;
13     if (IsPrime(num)) cout << "YES" << endl;
14     else cout << "NO" << endl;
15     return 0;
16 }

输入 97 时,输出为 NO。

2分
登录后查看选项
17 输入 119 时,输出为 YES。 2分
登录后查看选项
18 若将第 5 行的 <= 改成 <,程序输出不会改变。 2分
登录后查看选项
19 当程序执行第 8 行时,i 的值为 sqrt(num)。 2分
登录后查看选项
20 最坏情况下,此程序的时间复杂度是 ( )。 3分
登录后查看选项
21 若输入为 20 以内的正整数,则输出 YES 的概率是 ( )。 3分
登录后查看选项
22
01 #include <bits/stdc++.h>
02 using namespace std;
03 const int mod = 2048;
04 long long c,n;
05 long long kasumi(long long x,long long mi) {
06     long long res=1;
07     while (mi) {
08         if (mi & 1){
09             res = (res * x) % mod;
10		   }
11         x = (x * x) % mod;
12         mi >>= 1;
13     }
14     return res;
15 }
16 int main() {
17     cin >> n >> c;
18     if (n == 3) {
19         printf("%lld", c * (c - 1));
20         return 0;
21     }
22     long long ans = (kasumi(c-1,n) + (c-1) * kasumi(-1,n)) % mod + mod;
23     cout << ans << endl;
24     return 0;
25 }

将第 9 行和第 11 行中的圆括号去掉,程序输出不变。

2分
登录后查看选项
23 将第 12 行的 mi >>= 1 改为 mi *= 0.5,程序输出不变。 2分
登录后查看选项
24 若输入 4 4,输出为 78。 2分
登录后查看选项
25 此程序的时间复杂度为 O(log n)。 2分
登录后查看选项
26 若输入 3 4,输出为 ( )。 4分
登录后查看选项
27
01 #include <cstdio>
02 int n,r,num[10000];
03 bool mark[10000];
04 void print() {
05     for (int i=1; i<=r; i++)
06         printf("%d ", num[i]);
07     printf("\n");
08 }
09 void search(int x) {
10     for (int i=1; i<=n; i++)
11         if (!mark[i]) {
12             num[x] = i;
13             mark[i] = true;
14             if (x == r) print();
15             search(x + 1);
16             mark[i] = false;
17         }
18 }
19 int main() {
20     scanf("%d%d", &n, &r);
21     search(1);
22 }

程序结束时,对任意 1 ≤ i ≤ n,都有 mark[i] = 0。

2分
登录后查看选项
28 若 n < r,则程序无输出。 2分
登录后查看选项
29 若输入 4 3,则输出中数字 1 和 2 的个数不同。 2分
登录后查看选项
30 此程序的时间复杂度为 O(n)。 2分
登录后查看选项
31 若输入 6 3,则函数 print 的执行次数为 ( )。 3分
登录后查看选项
32 若输入 7 4,则输出的最后一行 ( )。 3分
登录后查看选项

完善程序 共10道

33

Kruskal 求最小生成树的思想:首先将 n 个点看作 n 个独立的集合,将所有边排序(从小到大)。然后按排好的顺序枚举每一条边,判断这条边连接的两个点是否属于同一集合。若不属于同一集合,则将这条边加入最小生成树,并将两个点所在的集合合并为一个集合。若属于同一集合,则跳过。直到找到 n-1 条边为止。

01 #include <iostream>
02 #include <algorithm>
03 using namespace std;
04 struct point { int x, y, v; } a[10000];
05 int cmp(const point &a, const point &b) {
06     if ( ① ) return 1;
07     return 0;
08 }
09 int fat[101];
10 int father(int x) {
11     if (fat[x] != x) return fat[x] = ②;
12     return fat[x];
13 }
14 void unionn (int x, int y) {
15     int fa = father(x), fb = father(y);
16     if (fa != fb) fat[fa] = fb;
17 }
18 int main() {
19     int i, j, n, m, k=0, ans=0, cnt=0;
20     cin >> n;
21     for (i=1; i<=n; i++)
22         for (j=1; j<=n; j++) {
23             cin >> m;
24             if (m != 0) {
25                 k++; a[k].x=i; a[k].y=j; a[k].v=m;
26             }
27         }
28     sort(a+1, a+1+k, ③);
29     for (i=1; i<=n; i++) fat[i] = i;
30     for (i=1; i<=k; i++) {
31         if (father(a[i].x) != ④) {
32             ans += a[i].v;
33             unionn(a[i].x, a[i].y);
34             cnt++;
35             if ( ⑤ ) break;
36         }
37     }
38     cout << ans << endl;
39     return 0;
40 }

① 处应填 ( )。

3分
登录后查看选项
34 ② 处应填 ( )。 3分
登录后查看选项
35 ③ 处应填 ( )。 3分
登录后查看选项
36 ④ 处应填 ( )。 3分
登录后查看选项
37 ⑤ 处应填 ( )。 3分
登录后查看选项
38

欧拉路径问题是指从图中的一个顶点出发,是否能够一次性不回头地走遍所有的边(一次且仅一次)。算法代码如下。

01 #include <iostream>
02 using namespace std;
03 int G[5][5];
04 int visited[5][5];
05 int n = 5;
06 void euler(int u) {
07     for (int v=0; v < n; v++) {
08         if (G[u][v] && ①) {
09             cout << u << "->" << v << endl;
10             visited[u][v] = visited[v][u] = ②;
11             ③
12         }
13     }
14 }
15 int main() {
16     G[1][2] = G[2][1] = G[1][3] = ④ = 1;
17     G[2][4] = G[4][2] = G[3][4] = ⑤ = 1;
18     euler(1);
19     return 0;
20 }

① 处应填 ( )。

3分
登录后查看选项
39 ② 处应填 ( )。 3分
登录后查看选项
40 ③ 处应填 ( )。 3分
登录后查看选项
41 ④ 处应填 ( )。 3分
登录后查看选项
42 ⑤ 处应填 ( )。 3分
登录后查看选项