Files
cpp-courseware/2.Course/5.C++_Exam/NOI/CSP-J 初赛模拟卷/试题/CSP-J初赛模拟卷·第14套.md
T
xiaolinquan 0af92a68d9 整理 NOI 初赛资料目录并标准化 CSP-J 模拟卷
- 将18套模拟卷分离为试题和答案解析,补齐并规范逐题解析
- 补充SVG图示,统一试题排版并导出打印PDF
- 重整初赛专题训练与复习资料目录,清理旧版源文件
2026-11-06 17:50:51 +08:00

12 KiB
Raw Blame History

CSP-J 初赛模拟卷(第 14 套)
入门级 C++ 语言试题

一、单项选择题(共 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)