朝外信奥 2 队 2026-06-07 笔试训练题目

答案版
题型:单项选择题 + 阅读程序题 + 完善程序题
题量:28 题,满分 100 分
考试时间:6月17日
一、单项选择题(共15题)
每题只有一个正确选项,绿色为正确答案,并附简要解析。
1. 在 24*24 的点阵的字库里,汉字“一”和“编”的字模占用字节数分别是( )。
A. 72、72
B. 32、32
C. 32、72
D. 72、32
答案:A。24×24 点阵共 576 位,每个汉字占 576/8=72 字节。
2. 在计算机中通常用英文单词“BYTE”来表示( )。
A. 字
B. 字长
C. 二进制位
D. 字节
答案:D。BYTE 是字节,通常等于 8 个二进制位。
3. 已知一棵二叉树的前序遍历结果为 ABCDEF,中序遍历结果为 CBAEDF,则后序遍历的结果为( )。
A. CBEFDA
B. FEDCBA
C. CBEDFA
D. EDCBFA
答案:A。由前序和中序还原:根为 A,左子树后序为 CB,右子树后序为 EFD,所以整棵树后序为 CBEFDA。
4. 对一个满二叉树,m 个叶结点,n 个结点,则( )。
A. n=m+1
B. 2n=m+1
C. n=m-1
D. n=2m-1
答案:D。满二叉树满足叶结点数比度为 2 的结点数多 1,因此总结点数为 2m-1。
5. 下列叙述中,正确的是( )。
A. 线性表的线性存储结构优于链表存储结构
B. 队列的操作方式是先进后出
C. 栈的操作方式是先进先出
D. 二维数组是指它的每个数据元素为一个线性表的线性表
答案:D。二维数组可看作元素仍为线性表的一维数组;其余三项都错误。
6. 如果某二叉树的前序为 STUWV,中序为 UWTVS,那么该二叉树的后序是( )。
A. WUVTS
B. UWVTS
C. VWUTS
D. WUTSV
答案:A。由前序和中序还原二叉树后,后序遍历结果为 WUVTS
7. 表达式 (a+b)*c-d/e 的后缀表达式为( )。
A. ab+cde-*/
B. -*+abc/de
C. ab+c*de/-
D. abc*+de/
答案:C。先算 a+b,再乘 c,最后减去 d/e,后缀为 ab+c*de/-
8. 计算机的软件系统通常分为( )。
A. 硬件系统和软件系统
B. 高级软件和一般软件
C. 系统软件和应用软件
D. 军用软件和民用软件
答案:C。软件系统通常分为系统软件和应用软件两大类。
9. 下列描述计算机病毒的特性中,( )不是正确的。
A. 潜伏性
B. 传染性
C. 高速性
D. 危害性
答案:C。病毒常见特性包括潜伏性、传染性和危害性,“高速性”不是标准特征表述。
10. 一颗完全二叉树的结点总数为 41,其叶结点数( )。
A. 18 个
B. 19 个
C. 20 个
D. 21 个
答案:D。完全二叉树叶结点数为 ceil(n/2),即 21。
11. 由 4 个节点构成的形态不同的二叉树有( )种。
A. 10
B. 14
C. 16
D. 20
答案:B。不同形态二叉树数量满足卡特兰数,4 个节点对应 C_4 = 14
12. 一棵完全二叉树,共有 1234 个节点,其叶子结点的个数为( )。
A. 615
B. 616
C. 617
D. 210
答案:C。完全二叉树叶子结点数为 ceil(n/2),所以 ceil(1234/2)=617
13. 一棵树 T 有 2 个度数为 2 的结点,有 1 个度数为 3 的结点,有 3 个度数为 4 的结点,那么树 T 有( )个树叶。
A. 14
B. 6
C. 18
D. 7
答案:A。树中叶子数满足 n_0 = 1 + \sum (i-1)n_i,所以 1 + 1×2 + 2×1 + 3×3 = 14
14. 总共有 6 个不同的元素进栈,能得到( )种不同的出栈序列。
A. 123
B. 121
C. 132
D. 130
答案:C。不同出栈序列数量等于第 6 个卡特兰数,结果为 132
15. 23|15+9^16&69 的结果是( )。
A. 31
B. 5
C. 28
D. 3
答案:A。按优先级先算 15+9=2416&69=0,再得 24^0=24,最后 23|24=31
二、阅读程序题(共8题)
(一)阅读下面的程序代码,回答 16~19 题
代码功能:函数 co(i1) 用递推乘除的方式计算组合数 C(10,i1)。主函数先用 s=n+1 表示 C(10,0)+C(10,1),再累加 C(10,2)C(10,10),最终输出所有组合数之和 2^10=1024
程序 1
cpp
1#include <iostream>
2#include <cstdio>
3using namespace std;
4const int n=10;
5int s;
6 
7int co(int i1){
8 int j1,s1;
9 s1=n;
10 for (int j1 =n-1; j1 >=n-i1+1; --j1)
11 s1=(s1*j1)/(n-j1+1);
12 return s1;
13}
14 
15int main(){
16 s=n+1;
17 for (int i = 2; i <=n; ++i)s=s+co(i);
18 printf("s=%d",s);
19}
16. 将 17 行 i=2 改为 i=1,程序运行结果不会发生变化。
A. TRUE
B. FALSE
答案:B。原程序中 s=n+1=11 已经包含了 C(10,0)+C(10,1),若再从 i=1 开始,会把 C(10,1) 重复计算。
17. 将 08 行的 j1 去掉,程序运行结果不会发生变化。
A. TRUE
B. FALSE
答案:A。第 10 行的 for (int j1 ...) 已经重新定义了循环变量,去掉第 8 行中的 j1 不影响结果。
18. 当 i1=4 时,函数 co(i1) 的返回值为( )。
A. 120
B. 210
C. 252
D. 45
答案:B。函数 co(i1) 计算的是组合数 C(10,i1),因此 co(4)=C(10,4)=210
19. 程序输出为( )。
A. s=512
B. s=1024
C. s=256
D. s=2048
答案:B。程序计算的是 C(10,0)+C(10,1)+...+C(10,10),总和为 2^10=1024
(二)阅读下面的程序代码,回答 20~23 题
代码功能:程序定义递归函数 fun(x):当 x 为 0 或 1 时返回 3,否则返回 x-fun(x-2)。主函数计算并输出 fun(9),递归只沿着奇数项回退,依次得到 fun(1)=3fun(3)=0fun(5)=5fun(7)=2fun(9)=7
程序 2
cpp
1#include <cstdio>
2using namespace std;
3inline int fun(int x){
4 if(x==0||x==1)return 3;
5 else return x-fun(x-2);
6}
7int main(){
8 printf("%d",fun(9));
9 putchar('\n');
10 return 0;
11}
20. 将 04 行改为 if(x<=1) return(7 & 3);,程序输出结果不变。
A. TRUE
B. FALSE
答案:A。7 & 3 的结果仍为 3,而本程序递归过程中只会遇到 x=1x=0 的基准情形,所以输出不变。
21. 将 03 行的 inline 去掉,程序可以正常运行。
A. TRUE
B. FALSE
答案:A。inline 只是给编译器的内联建议,不影响函数语义,去掉后仍可正常编译运行。
22. 程序输出结果为( )。
A. 5
B. 6
C. 7
D. 8
答案:C。递推可得 fun(1)=3fun(3)=0fun(5)=5fun(7)=2,所以 fun(9)=9-2=7
23. 将 08 行的 fun(9) 改成 fun(10),输出为( )。
A. 3
B. 2
C. 4
D. 7
答案:A。由前面的递推继续计算,fun(8)=7,因此 fun(10)=10-7=3
三、完善程序(共5题)
(一)根据题意,完成下面程序
(统计个数)给出 n 个数,统计每个数能看到的数字个数。
例如:2 5 1 3 4。第一个数字 2 可以看到 5;第二个数字 5 可以看到 2、1、3、4;第三个数字 1 可以看到 5、3、4;第四个数字 3 可以看到 1、5、4;第五个数字 4 可以看到 3、5
代码功能:程序读入 n 个数字,对每个位置 i 统计它左右两侧能看到的数字个数。相邻数字一定可见;继续向左或向右扫描时,只有遇到比当前已看到最高数字更大的数字,才会新增一个可见数字,所以用 now 记录扫描方向上的最高值,用 b[i] 保存答案。
程序 3
cpp
1#include<iostream>
2using namespace std;
3int a[100];
4int b[100];
5int now;
6int main() {
7 int n;
8 cin >> n;
9 for (int i = 0; i < n; i++) {
10 cin >> a[i];
11 }
12 for (int i = 0; i < n; i++) {
13 now = ①;
14 if(i==0 || i==n-1) b[i]=1;
15 else b[i] = ②;
16 for (int j = ③; j >= 0; j--) {
17 if (a[j] > now) {
18 now = a[j];
19 b[i]++;
20 }
21 }
22 now = ④;
23 for (int j = ⑤; j < n; j++) {
24 if (a[j] > now) {
25 now = a[j];
26 b[i]++;
27 }
28 }
29 }
30 for (int i = 0; i < n; i++) {
31 cout << b[i] << " ";
32 }
33return 0;
34}
24. ①处应填( )。
A. a[i - 1]
B. a[i]
C. a[i + 1]
D. a[i] + 1
答案:A。向左扫描前,应先把当前左侧紧邻元素作为初始可见高度。
25. ②处应填( )。
A. 0
B. 1
C. 2
D. -1
答案:C。对中间位置的数字,左右紧邻的两个数字必然都能看到,因此初值应先记为 2。
26. ③处应填( )。
A. i-1
B. i-2
C. i+1
D. i+2
答案:B。左侧紧邻元素已作为初始高度处理,因此循环应从 i-2 继续向左扫描。
27. ④处应填( )。
A. a[i - 1]
B. a[i]
C. a[i + 1]
D. a[i] + 1
答案:C。向右扫描前,应先把当前右侧紧邻元素作为初始可见高度。
28. ⑤处应填( )。
A. i-1
B. i-2
C. i+1
D. i+2
答案:D。右侧紧邻元素已作为初始高度处理,因此循环应从 i+2 开始继续向右扫描。