普及组CSP-J2024初赛模拟卷3

*
您的姓名:
一、单项选择题(共 15 题,每题 2 分,共计 30 分;每题有且仅有一个正确选项)
1.
下列存储器按存取速度由快至慢排列,正确的是()。
A.硬盘>内存>高速缓存>U盘
B.高速缓存>内存>硬盘>U盘
C.高速缓存>硬盘>内存>U盘
D.U盘>硬盘>内存>高速缓存
2.
杨辉三角形和()算法的思想最接近。
A.贪心
B.二分
C. DFS
D.递推
3.
下列属于输入设备的是()。
A.显示器
B.麦克风
C.音箱
D.打印机
4.
小写字母 a 的 ASCII 码值为 97,小写字母 z 的 ASCII 码值是()。
A. 120
B. 119
C. 122
D. 121
5.
IP地址是每台上网的计算机所必需的,下列 IP 地址中可以作为合法主机地址的是
()。
A.300.300.300.300
B. 200.256.192.8
C. 192.168.1.12
D. 0.0.0.0
6.
下面哪个可以用作 C++ 程序中的标识符?()
A. default
B. private
C. this
D. them
7.
快速排序在最坏情况下运行的时间复杂度是()。
A. O(logn)
B. O(n)
C. O(n^2)
D. O(nlogn)
8.
字符串 a="98",字符串 b="123",使用 strcmp 函数,比较两者大小的结果是()。
A.a大
B.b大
C.一样大
D.无法判断
9.
关于计算机网络,下面的说法哪个是正确的?()
A.现在的计算机互联网是俄罗斯人发明的
B.计算机网络拓扑结构只包括星形、流水线型和环形
C.TCP/IP 是因特网的最基本的协议
D.SMTP 属于物理层协议
10.
关于信息安全与网络道德,下列做法正确的是()。
A.确认环境安全后再输入支付密码
B.随意点击不熟悉的电子邮件中的链接
C.未经许可将其他人的私密照片和视频上传到互联网上
D.在微信里随意转发未经证实的信息
11.
现在有一个十进制算式 13*64+7,它等于二进制数的()。
A. 1100100111
B. 1101001111
C. 1101000111
D. 1111101101
12.
逻辑表达式 A=true,B=C=D=false,则逻辑表达式取值为真的是()。
A. (A Λ B) V (C Λ D V ﹁A)
B. ﹁((A Λ B V C ) Λ D)
C. A Λ (B V C V D) V D
D. (A V (C V D)) Λ B
13.
某二叉树树根层次为 0,则有 64 个结点的完全二叉树的高度是()。
A. 9
B. 8
C. 7
D. 6
14.
书架上同一格放 5 本书,A 和 B 必须相邻,C 和 D 必须不相邻,不同的放法共有()种。
A. 24
B. 12
C. 18
D. 48
15.
字符串 S="abcdefgh" 的子串个数为()。
A. 33
B. 35
C. 37
D. 36
二、阅读程序(程序输入不超过数组或字符串定义的范围;判断题正确填 A,错误填 B;除特殊说明外,判断题每题 1.5 分,选择题每题 3 分,共计 40 分)
(1)
01 #include<bits/stdc++.h>
02 using namespace std;
03 const int SIZE = 100007;
04 int a[SIZE],b[SIZE];
05 int main()
06 {
07     int n,m,p,q,count=0,ret=0;
08     cin >> n >> m;
09     for(int i = 1; i <= n; i++)
10     {
11         cin >> p >> q;
12         a[p]++;
13         a[q+1]--;
14     }
15     for(int i = 1; i <= m; i++)
16     {
17         count += a[i];
18         ret += count;
19     }
20     cout << ret;
21     return 0;
22 }

注:输入流中 1≤p≤q<m。
判断题
16.
将输入的 p 和 q 改成任意的整数,运行程序都不会出错。()
A.对
B.错
17.
将第 7 行中的 count=0 去掉,只定义 count 变量,程序的运行结果不会改变。()
A.对
B.错
18.
将第 17 行和第 18 行互换位置,程序的运行结果不会发生变化。()
A.对
B.错
19.
将第 15 行中的 i=1 改为 i=0,程序的运行结果不会改变。()
A.对
B.错
选择题
20.
将第 12~13 行中的 p 和 q+1 分别改为 p-1 和 q,则输出结果()。
A.变大
B. 可能变小
C.不变
D.都有可能
21.
若输入为 4 4 1 2 2 3 3 3 1 3,则输出为()。
A. 6
B. 10
C. 7
D. 8
(2)
01 #include<bits/stdc++.h>
02 using namespace std;
03 bool fun(int n)
04 {
05     int i=7;
06     if(n==2 || n==3 || n==5)
07         return true;
08     if(n==1 || n%2==0 || n%3==0 || n%5==0)
09         return false;
10     while(i*i<=n)
11     {
12         if(n%i==0)
13             return false;
14         i+=4;
15         if(n%i==0)
16             return false;
17         i+=2;
18     }
19     return true;
20 }
21 int main()
22 {
23     int n,m;
24     cin>>n>>m;
25     if(fun(n) && fun(m) && fun(n+m+1))
26         cout<<"YES"<<endl;
27     else
28         cout<<"NO"<<endl;
29     return 0;
30 }
判断题
22.
程序中 n 和 m 只有输入正整数,程序的输出值才可能是 YES。()
A.对
B.错
23.
程序中用到了递归函数 bool fun(int n)。()
A.对
B.错
24.
若输入 n 和 m 都是素数,程序的输出值一定是 YES。()
A.对
B.错
25.
若输入 n 和 m 的值分别是 -1 和 2027,则程序的输出值是 YES。()
A.对
B.错
选择题
26.
若输出 YES,则输入可能为()。
A. 23 29
B. 23 24
C.23 27
D.31 37
27.
若输出 NO,则输入可能为()。
A. 53 13
B. 2029 -1
C. 2023 2027
D.97 41
(3)
01 #include<bits/stdc++.h>
02 using namespace std;
03 int main()
04 {
05     stack<int> s;
06     char a[1005];
07     int back,front,result;
08     cout << "Input: ";
09     cin >> a;
10     for(int i = 0; i < strlen(a); i++)
11     {
12         if(a[i] >= '0' && a[i] <= '9')
13             s.push(a[i] - '0');
14         else
15         {
16             back = s.top();
17             s.pop();
18             front = s.top();
19             s.pop();
20             if(a[i] == '+')
21                 result = front + back;
22             else if(a[i] == '-')
23                 result = front - back;
24             else if(a[i] == '*')
25                 result = front * back;
26             else if(a[i] == '/')
27                 result = front / back;
28             else if(a[i] == '%')
29                 result = front % back;
30             s.push(result);
31         }
32     }
33     cout << "Output: " << s.top() << endl;
34     return 0;
35 }
判断题
28.
将第 1 行改为 #include<iostream>,程序的运行结果不变。()
A.对
B.错
29.
本程序用到了队列而不是栈的思想。()
A.对
B.错
30.
将第 12 行中的 '0' 替换为 48,程序的运行结果不会改变。()
A.对
B.错
31.
如果输入的都是非零数字和加、减、乘、除四则运算符号,那么运行程序输出的值一定是正整数。()
A.对
B.错
选择题
32.
本题的主要思想是求()表达式的值。
A.前缀
B.后缀
C.中缀
D.逻辑
33.
若输入 234--,那么程序的输出结果是()。
A. 3
B. 2
C. 1
D. 0
34.
(4分)若输入数据为 5432*%/,则输出是()。
A. 3
B. 2
C. 1
D. 0
三、完善程序(单选题,每小题3分,共计30分)
(1)输入两个正整数 n 和 m (1<n<10,1<m<n),在 1~n 这 n 个数中任取 m 个数,按字典序从小到大输出所有这样的排列。
输入格式:
    第 1 行输入 n 和 m。
输出格式:
    输出从 n 个数中挑出 m 个数组成的所有排列,按从小到大的顺序输出。
输入样例:
    4 3
输出样例:
    1 2 3
    1 2 4
    1 3 2
    1 3 4
    1 4 2
    1 4 3
    2 1 3
    2 1 4
    2 3 1
    2 3 4
    2 4 1
    2 4 3
    3 1 2
    3 1 4
    3 2 1
    3 2 4
    3 4 1
    3 4 2
    4 1 2
    4 1 3
    4 2 1
    4 2 3
    4 3 1
    4 3 2

01 #include<bits/stdc++.h>
02 using namespace std;
03 const int MAXN = 15;
04 bool flag,vis[MAXN];
05 int n,m,i,j,k,a[MAXN];
06 int main()
07 {
08     cin>>n>>m;
09     memset(vis,false,sizeof(vis));
10     for(i=1;i<=m;i++)
11     {
12         a[i]=i;
13         vis[i]=true;
14     }
15     flag=true;
16     while(flag)
17     {
18         for(i=1;i<=m-1;i++)
19             cout<<a[i]<<" ";
20         cout<<a[m]<<endl;
21         ①;
22         for(i=m;i>=1;i--)
23         {
24             ②;
25             for(j=a[i]+1;j<=n;j++)
26                 if(!vis[j])
27                 {
28                     vis[j]=true;
29                     ③;
30                     flag=true;
31                     break;
32                 }
33             if(flag)
34             {
35                 for(k=i+1;k<=m;k++)
36                     for(j=1;④;j++)
37                         if(!vis[j])
38                         {
39                             a[k]=j;
40                             vis[j]=true;
41                             break;
42                         }
43                 ⑤;
44             }
45         }
46     }
47     return 0;
48 }
35.
①处应填()。
A. flag = false
B. flag = true
C. vis[1] = false
D. vis[1] = true
36.
②处应填()。
A. vis[i] = true
B. a[i] = i
C. vis[a[i]] = true
D. vis[a[i]] = false
37.
③处应填()。
A.a[i] = i
B.a[i] = j
C.a[i] = true
D.a[i] = false
38.
④处应填()。
A.j<=m
B.j<=k
C.j<=n
D.j<=i
39.
⑤处应填()。
A. exit
B. return 0
C. continue
D. break
(2)求一个有向图中有多少个环并输出环的总数。
输入格式:
    第 1 行为 n,第 2 行为 n 个点的编号。
输出格式:
    输出有向图的环的总数。
输入样例:
    10
    7 1 4 3 2 5 9 8 0 6
输出样例:
    6
样例说明:
    a[0]=7,a[7]=8,a[8]=0,{0,7,8}构成一个环;
    a[1]=1,{1}构成一个环;
    a[2]=4,a[4]=2,{2,4}构成一个环;
    a[3]=3,{3}构成一个环;a[5]=5,{5}构成一个环;
    a[6]=9,a[9]=6,{6,9}构成一个环。
    该有向图共有 6 个环。

01 #include<bits/stdc++.h>
02 using namespace std;
03 int n,point[100];
04 bool vis[100];
05 int main()
06 {
07     int cnt;
08     scanf("%d",&n);
09     for(int i = 0; i < n; ++i)
10     {
11         scanf("%d",①);
12         ②;
13     }
14     cnt = 0;
15     for(int i = 0; i < n; ++i)
16     {
17         if(③)
18         {
19             for(int j = i; !vis[j]; ④)
20             {
21                 vis[j] = true;
22             }
23             ⑤;
24         }
25     }
26     printf("%d",cnt);
27     return 0;
28 }
40.
①处应填()。
A. &point
B. point + i
C. &point +i
D. point[i]
41.
②处应填()。
A. vis[i] = i
B. vis[i] = point[i]
C. vis[i] = true
D. vis[i] = false
42.
③处应填()。
A. !vis[i]
B. vis[i]
C. !vis[point[i]]
D. vis[point[i]]
43.
④处应填()。
A. j = point[i]
B. j = point[j]
C. i = point[j]
D. i = point[i]
44.
⑤处应填()。
A. cnt = j+1
B. cnt = n-j
C. ++cnt
D. cnt = n-i
问卷星提供技术支持
举报