- 将18套模拟卷分离为试题和答案解析,补齐并规范逐题解析 - 补充SVG图示,统一试题排版并导出打印PDF - 重整初赛专题训练与复习资料目录,清理旧版源文件
12 KiB
一、单项选择题(共 15 题,每题 2 分,共计 30 分)
( ) 1. 一个 32 位整型变量占用( )个字节。
A. 4 B. 8 C. 32 D. 128
( ) 2. 二进制数 00100100 和 00010101 的和是( )。
A. 00101000 B. 001010100 C. 01000101 D. 00111001
( ) 3. 关于汇编语言,下列说法错误的是( )。
A. 是一种与具体硬件相关的程序设计语言
B. 在编写复杂程序时,相对于高级语言而言代码量较大,且不易调试
C. 可以直接访问寄存器、内存单元、以及I/O端口
D. 随着高级语言的诞生,如今已完全被淘汰,不再使用
( ) 4. FTP 可以用于( )。
A. 远程传输文件 B. 发送电子邮件 C. 浏览网页 D. 网上聊天
( ) 5. 原字符串中任意一段连续的字符所组成的新字符串称为子串。
则字符 “AAABBBCCC” 共有( )个不同的非空子串。
A. 3 B. 12 C. 36 D. 45
( ) 6. 设变量x为非负float型且已赋值,则以下语句中能将x中的数值保留到小数点后两位,并将第三位四舍五入的是( )。
A. x = (x * 100) + 0.5 / 100.0; B. x = (x * 100 + 0.5) / 100.0;
C. x = (int)(x * 100 + 0.5)/100.0; D. x = (x / 100 + 0.5) * 100.0;
( ) 7. 一个字长为8位的整数的补码是11111001,则它的原码是( )。
A. 00000111 B. 01111001 C. 11111001 D. 10000111
( ) 8. 下面是根据欧几里得算法编写的函数,它所计算的是a和b的( )。
int euclid(int a, int b)
{
if (b == 0)
return a;
else
return euclid(b, a % b);
}
A. 最大公共质因子 B. 最小公共质因子 C. 最大公约数 D. 最小公倍数
( ) 9. 有7个一模一样的苹果,放到3个一样的盘子中,盘子可以为空,一共有( )种放法。
A. 7 B. 8 C. 21 D. 3^7
( ) 10. 如果树根算第1层,那么一棵 n 层的二叉树最多有( )个结点。
A. $2^{n} - 1$ B. $2^{n}$ C. $2^{n} + 1$ D. 2^{n + 1}
( ) 11. 无向完全图是图中每对顶点之间都恰好有一条边的简单图。已知无向完全图G有7个顶点,则它共有( )条边。
A. 7 B. 21 C. 42 D. 49
( ) 12. 如果根的高度为 1,具有 61 个结点的完全二叉树的高度为( )。
A. 5 B. 6 C. 7 D. 8
( ) 13. 对于给定的序列 ${a_k}$,我们把 (i,j) 称为逆序对当且仅当 i < j 且 $a_i > a_j$。那么序列 \{1,7,2,3,5,4\} 的逆序对数为( )个。
A. 4 B. 5 C. 6 D. 7
( ) 14. 给定含有 n 个互不相同元素的单峰数组 L,满足先严格递增、后严格递减,峰顶位于数组内部。用下面的二分算法寻找峰顶,请将 a、b、c 三行代码依次填入空白处。正确的填空顺序是( )。
a. return Search(k + 1, r)
b. return Search(l, k - 1)
c. return L[k]
Search(l, r):
if l == r then return L[l]
k = floor((l + r) / 2)
if L[k] > L[k - 1] and L[k] > L[k + 1]: ______
else if L[k] < L[k + 1]: ______
else: ______
调用 Search(2, n - 1)
A. c,a,b B. c,b,a C. a,b,c D. b,a,c
( ) 15. 广度优先搜索时,需要用到的数据结构是( )。
A. 链表 B. 队列 C. 栈 D. 散列表
二、阅读程序(程序输入不超过数组或字符串定义的范围,判断题正确填 √,错误填 ×;共 18 小题,共计 37 分,各小题分值见题目)
(1)
1 #include<iostream>
2 using namespace std;
3 #define MAXN 20
4 int gu[MAXN][MAXN];
5 int luo(int n, int m) {
6 if(n <= 1 || m < 2)
7 return 1;
8 if(gu[n][m] != -1)
9 return gu[n][m];
10 int ans=0;
11 for(int i = 0; i <m; i += 2)
12 ans+=luo(n-1, i);
13 gu[n][m] = ans;
14 return ans;
15 }
16 int main() {
17 int n, m;
18 cin >> n >> m;
19 for(int i = 0; i < MAXN; i++)
20 for(int j = 0; j < MAXN; j++)
21 gu[i][j]= -1;
22 cout << luo(n, m);
23 return 0;
24 }
判断题
( ) 16. (1分) luo函数中,m的值不可能是奇数。( )
( ) 17. (1分) 若将第11行的" <"改为" <=",程序的输出结果可能会改变。( )
( ) 18. (2分) 若将第8、9、13行删除,程序的运行的结果不变。( )
( ) 19. (2分) 在添加合适的头文件后,将第19到21行替换为“memset(gu, 255,sizeof(gu));”可以起到相同的作用。( )
单选题
( ) 20. (4分) 若输入数据为4 8,则输出为( )。
A. 7 B. 8 C. 15 D. 16
( ) 21. (3分) 最坏情况下,此程序的时间复杂度是( )。
A. O(m²n) B. O(nm!) C. O(n²) D. O(n²m)
(2)
1 #include <iostream>
2 using namespace std;
3
4 long long n, ans;
5 int k, len;
6 long long d[1000000];
7
8 int main() {
9 cin >> n >> k;
10 d[0] = 0;
11 len= 1;
12 ans = 0;
13 for (long long i = 0; i <n; ++i) {
14 ++d[0];
15 for (int j = 0; j + 1<len; ++j) {
16 if (d[j] == k) {
17 d[j] = 0;
18 d[j + 1] += 1;
19 ++ans;
20 }
21 }
22 if (d[len - 1] == k) {
23 d[len - 1] = 0;
24 d[len] =1;
25 ++len;
26 ++ans;
27 }
28 }
29 cout << ans << endl;
30 return 0;
31 }
假设输入的 n 是不超过 2^{62} 的正整数,k 都是不超过10000的正整数,完成下面的判断题和单选题:
判断题
( ) 22. (1.5分) 若 k = 1,则输出 ans 时,len = n。( )
( ) 23. (1.5分) 若 k > 1,则输出 ans 时,len 一定小于 n。( )
( ) 24. (1.5分) 若 k > 1,则输出 ans 时, k^{len} 一定大于 n。( )
单选题
( ) 25. (1.5分) 若输入的 n 等于:$10^{15}$,输入的 k 为1,则输出等于( )。
A. 1 B. $(10^{30}-10^{15})/2$ C. $(10^{30}+10^{15})/2$ D. 10^{15}
( ) 26. (3分) 若输入的 n 等于205,891,132,094,649(即 $3^{30}$),输入的 k 为3,则输出等于( )。
A. $3^{30}$ B. $(3^{30}-1)/2$ C. $3^{30}-1$ D. (3^{30}+1)/2
( ) 27. (3分) 若输入的 n 等于100,010,002,000,090,输入的 k 为10,则输出等于( )。
A. 11,112,222,444,543 B. 11,122,222,444,453
C. 11,122,222,444,543 D. 11,112,222,444,453
(3)
1 #include<cstdio>
2 using namespace std;
3 int n, m;
4 int a[100], b[100];
5
6 int main() {
7 scanf("%d%d", &n, &m);
8 for (int i = 1; i <= n; ++i)
9 a[i] = b[i] = 0;
10 for (int i = 1; i <= m; ++i) {
11 int x, y;
12 scanf("%d%d", &x, &y);
13 if (a[x] < y && b[y] < x) {
14 if (a[x] > 0)
15 b[a[x]] = 0;
16 if (b[y] > 0)
17 a[b[y]] = 0;
18 a[x] = y;
19 b[y] = x;
20 }
21 }
22 int ans = 0;
23 for (int i = 1; i <= n; ++i) {
24 if (a[i] == 0)
25 ++ans;
26 if (b[i] == 0)
27 ++ans;
28 }
29 printf("%d", ans);
30 return 0;
31 }
假设输入的 n 和 m 都是正整数,x 和 y 都是在 [1, n] 的范围内的整数,完成下面的判断题和单选题:
判断题
( ) 28. (1.5分) 当 m > 0 时,输出的值一定小于 2n。( )
( ) 29. (1.5分) 执行完第27行的"++ans"时,ans一定是偶数。( )
( ) 30. (1.5分) a[i] 和 b[i] 不可能同时大于0。( )
( ) 31. (1.5分) 右程序执行到第13行时,x总是小于y,那么第15行不会被执行。( )
单选题
( ) 32. (3分) 若 m 个 x 两两不同,且 m 个 y 两两不同,则输出的值为( )
A. 2n - 2m B. 2n + 2 C. 2n - 2 D. 2n
( ) 33. (3分) 若 m 个 x 两两不同,且 m 个 y 都相等,则输出的值为( )
A. 2n - 2 B. 2n C. 2m D. 2n - 2m
三、完善程序(程序输入不超过数组或字符串定义的范围;共 10 小题,共计 29 分,各小题分值见题目)
(1)
完善程序:
(打印日历)输入月份 $m(1 \leq m \leq 12)$,按一定格式打印2015年第 m 月的月历。例如,2015年1月的月历打印效果如下(第一列为周日):
| S | M | T | W | T | F | S |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
1 #include <iostream>
2 #include <string>
3 using namespace std;
4 const int dayNum[] = {-1, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
5 int m, offset, i;
6 int main()
7 {
8 cin >> m;
9 cout << "S\tM\tT\tW\tT\tF\tS" << endl; /* '\t'为 TAB 制表符 */
10 __(1)__;
11 for (i = 1; i < m; i++)
12 offset = __(2)__;
13 for (i = 0; i < offset; i++)
14 cout << '\t';
15 for (i = 1; i <= __(3)__; i++)
16 {
17 cout << __(4)__;
18 if (i == dayNum[m] || __(5)__ == 0)
19 cout << endl;
20 else
21 cout << '\t';
22 }
23 return (0);
24 }
( ) 34. (3分) (1)处应填:________________
( ) 35. (3分) (2)处应填:________________
( ) 36. (2.5分) (3)处应填:________________
( ) 37. (2.5分) (4)处应填:________________
( ) 38. (3分) (5)处应填:________________
(2)
(矩阵变幻)有一个奇幻的矩阵,在不停的变幻,其变幻方式为: 数字 0 变成矩阵
0 0
0 1
数字 1 变成矩阵
1 1
1 0
最初该矩阵只有一个元素 0,变幻n 次后,矩阵会变成什么样? 例如,矩阵最初为:[0]; 矩阵变幻 1 次后:
0 0
0 1
矩阵变幻 2 次后:
0 0 0 0
0 1 0 1
0 0 1 1
0 1 1 0
输入一行一个不超过 10 的正整数 n。输出变幻 n 次后的矩阵。
试补全程序。
提示:
<< 表示二进制左移运算符,例如(11) _{2} << 2 = (1100) _{2} ;
而 ^ 表示二进制异或运算符,它将两个参与运算的数中的每个对应的二进制位进行比较,若两个二进制位相同,则运算结果的对应二进制位为 0,反之为 1。
1 #include <cstdio>
2 using namespace std;
3 int n;
4 const int max_size = 1 << 10;
5
6 int res[max_size][max_size];
7
8 void recursive(int x, int y, int n, int t) {
9 if (n == 0) {
10 res[x][y] = __(1)__;
11 return;
12 }
13 int step = 1 << (n - 1);
14 recursive(__(2)__, n - 1, t);
15 recursive(x, y + step, n - 1, t);
16 recursive(x + step, y, n - 1, t);
17 recursive(__(3)__, n - 1, !t);
18 }
19
20 int main() {
21 scanf("%d", &n);
22 recursive(0, 0, __(4)__);
23 int size = __(5)__;
24 for (int i = 0; i < size; i++) {
25 for (int j = 0; j < size; j++)
26 printf("%d", res[i][j]);
27 puts("");
28 }
29 return 0;
30 }
( ) 39. (3分) (1)处应填
A. n%2 B. 0 C. t D. 1
( ) 40. (3分) (2)处应填
A. x-step,y-step B. x,y-step C. x-step,y D. x, y
( ) 41. (3分) (3)处应填
A. x-step,y-step B. x + step, y + step C. x-step,y D. x,y-step
( ) 42. (3分) (4)处应填
A. n-1,n%2 B. n, 0 C. n, n%2 D. n-1, 0
( ) 43. (3分) (5)处应填
A. $1 < < (n + 1)$ B. 1<<n C. $n + 1$ D. 1 \ll (n - 1)