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

答案版
题型:单项选择题、阅读程序题、完善程序题
题量:35 题,满分 100 分
考试时间:6月14日
一、单项选择题(共20题,每题2分,共40分)
每题只有一个正确选项,点击按钮后显示正确答案和简要解析。
1. 一张分辨率为 1024×768、每个像素用 24 位表示的未压缩位图图片,至少需要( )存储空间。
A. 768KB
B. 1.5MB
C. 2MB
D. 2.25MB
答案:D。24 位等于 3 字节,每个像素占 3 字节。总容量为 1024×768×3=2359296 字节,即 2304KB=2.25MB
2. 如果 65 536 种颜色用二进制编码来表示,至少需要( )个二进制位。
A. 16
B. 8
C. 12
D. 10
答案:A。2^16=65536,所以要表示 65536 种不同颜色,至少需要 16 个二进制位。
3. 搜索算法中的 BFS 算法经常用到的数据结构是( )。
A. 堆
B. 栈
C. 链表
D. 队列
答案:D。BFS 是广度优先搜索,通常使用队列保存待扩展的结点,按照“先进入、先处理”的顺序逐层搜索。
4. 在已经从小到大排好序的 n 元素单向链表中查询是否存在关键字为 k 的元素,最坏情况下运行的时间复杂度是( )。
A. O(logn)
B. O(n)
C. O(n^2)
D. O(nlogn)
答案:B。单向链表不能像数组一样随机访问中间元素,查找时只能从表头沿指针逐个向后比较。即使链表已有序,最坏情况下也可能要检查到表尾,因此时间复杂度为 O(n)
5. 某二叉树共有 53 个结点,其中有 10 个结点只有一个孩子结点,则该二叉树中的叶子结点数是( )个。
A. 21
B. 22
C. 23
D. 32
答案:B。设叶子结点数为 n0,只有一个孩子的结点数为 n1,有两个孩子的结点数为 n2。二叉树中有 n0=n2+1,题目给出 n1=10,且 n0+n1+n2=53。代入得 (n2+1)+10+n2=53,所以 2n2=42n2=21,因此 n0=22
6. 有 8 个结点的非连通无向图最多有( )条边。
A. 8
B. 7
C. 21
D. 49
答案:C。要让 8 个结点的无向图仍然非连通,同时边数尽量多,应让其中 7 个结点组成完全图,剩下 1 个结点孤立。7 个结点的完全图边数为 C(7,2)=7×6/2=21,所以最多有 21 条边。
7. 与二进制数 101101.011 相等的十六进制数是( )
A. 2D.3
B. 2D.6
C. B5.6
D. 2B.6
答案:B。二进制转十六进制时,以小数点为界,左右分别每 4 位一组。整数部分 101101 补成 0010 1101,得到 2D;小数部分 .011 补成 .0110,得到 .6,所以结果是 2D.6
8. 所谓的“中断”是指( )。
A. 操作系统随意停止一个程序的运行
B. 当出现需要时,CPU 暂时停止当前程序的执行转而处理新情况的过程
C. 因停机而停止一个程序的运行
D. 电脑死机
答案:B。中断是 CPU 响应外部或内部事件,暂时转去执行中断处理程序,处理完后再返回原程序。
9. 计算机病毒是( )。
A. 通过计算机传播的危害人体健康的一种病毒
B. 人为制造的能够入侵计算机系统并给计算机带来故障的指令或程序集合
C. 一种由计算机元器件老化而产生的对生态环境有害的物质
D. 利用计算机海量运算能力而研制出来的用于疾病预防的新型病毒
答案:B。计算机病毒本质上是具有破坏性、传播性或隐蔽性的程序代码,不是生物病毒。
10. FTP 可以用于( )。
A. 远程文件传输
B. 发送电子邮件
C. 浏览网页
D. 网上聊天
答案:A。FTP 是 File Transfer Protocol,即文件传输协议,主要用于在网络上传输文件。
11. 以下哪个说法是正确的?( )
A. 第一台电子计算机 ENIAC 是基于集成电路的产物
B. 计算机必须要同时有 IP 地址和域名才能接入互联网
C. david@163.com 是一个正确的电子邮箱地址
D. 手机上收到的短信,里面的链接可以随意点击打开
答案:C。电子邮箱地址通常由“用户名@域名”组成,david@163.com 符合这一格式。A 错在 ENIAC 使用电子管,不是集成电路;B 错在接入互联网需要 IP 地址,不一定需要域名;D 错在短信链接可能包含钓鱼或恶意内容,不能随意点击。
12. 二叉树的中序序列为 ABCEFGHD,后序序列为 ABFHGEDC,则其前序序列为( )。
A. CBADEGHF
B. CBADEGFH
C. CBDAEGFH
D. CBADGEFH
答案:B。后序序列最后一个结点是根,所以整棵树根为 C。在中序序列 ABCEFGHD 中,C 左边是 AB,右边是 EFGHD。左子树由中序 AB、后序 AB 得到前序 BA;右子树根为后序最后的 D,其左子树根为 E,再由 FGH 得到根 G、左右孩子 FH,所以右子树前序为 DEGFH。合并得到前序序列 CBADEGFH
C B A D E G F H
13. 从班级中体育比较好的 12 人中选 5 人去参加运动会,其中甲、乙、丙最多同时选两人,不同的选法共有( )种。
A. 792
B. 756
C. 720
D. 676
答案:B。先不考虑限制,从 12 人中选 5 人共有 C(12,5)=792 种。限制是甲、乙、丙不能三人同时入选,因此要减去三人都被选上的情况:甲、乙、丙已占 3 个名额,还需从其余 9 人中选 2 人,有 C(9,2)=36 种。所以符合条件的选法为 792-36=756
14. 线性表若采用链表存储结构,要求内存中可用存储单元地址( )。
A. 必须连续
B. 部分地址必须连续
C. 一定不连续
D. 连续不连续均可
答案:D。链表通过指针连接结点,结点在内存中可以连续,也可以不连续。
15. 以下哪个结构可以用来存储图?( )
A. 栈
B. 二叉树
C. 邻接表
D. 队列
答案:C。图常见的存储方式有邻接矩阵和邻接表。邻接表会为每个顶点保存与它相邻的顶点,适合表示边较少的图;栈和队列通常是算法过程中的辅助结构,不是图的基本存储结构。
16. 前序遍历序列与中序遍历序列相同的二叉树为( )。
A. 根结点无左子树的二叉树
B. 根结点无右子树的二叉树
C. 只有根结点的二叉树或非叶结点只有左子树的二叉树
D. 只有根结点的二叉树或非叶结点只有右子树的二叉树
答案:D。前序是“根-左-右”,中序是“左-根-右”。若两者相同,根必须首先出现,所以每个非叶结点都不能有左子树,只能一路向右。
17. 如果根的高度为 1,具有 61 个结点的完全二叉树的高度为( )。
A. 5
B. 6
C. 7
D. 8
答案:B。高度为 5 的二叉树最多有 2^5-1=31 个结点;高度为 6 的二叉树最多有 2^6-1=63 个结点。61 介于 32 到 63 之间,所以高度为 6。
18. 下列选项中不属于视频文件格式的是( )。
A. TXT
B. AVI
C. MOV
D. RMVB
答案:A。TXT 是文本文件格式;AVI、MOV、RMVB 都是常见视频文件格式。
19. 设某算法的计算时间表示为递推关系式 T(n)=T(n-1)+n(n 为正整数)及 T(0)=1,则该算法的时间复杂度为( )。
A. O(logn)
B. O(nlogn)
C. O(n)
D. O(n^2)
答案:D。展开得 T(n)=1+1+2+...+n,主要项为 n(n+1)/2,所以时间复杂度为 O(n^2)
20. 在 NOI 系列赛事中参赛选手必须使用由承办单位统一提供的设备。下列物品中不允许选手自带的是( )。
A. 鼠标
B. 笔
C. 身份证
D. 准考证
答案:A。NOI 系列赛事中比赛设备由承办单位统一提供,鼠标属于计算机外设,通常不能自带;笔、身份证、准考证属于考试所需个人物品。
二、阅读程序题(共10题,每题4分,共40分)
阅读下面程序,回答第 21~25 题。
阅读程序
  1. #include <iostream>
  2. using namespace std;
  3. int i,j,f,a[9],n=8;
  4. int main(){
  5. for (int i = 1; i <=n; i++){
  6. f=i%2;
  7. if(f==0)a[i]=0;
  8. else a[i]=1;
  9. for (int j = 1; j <=i; j++)
  10. if(f==0)a[i]=a[i]+j;
  11. else a[i]=a[i]*j;
  12. }
  13. for (int i = 1; i <=n; i++)
  14. printf("%5d",a[i]);
  15. return 0;
  16. }
代码功能:这段程序按 i 的奇偶性分别计算数组 a[i]:当 i 为偶数时累加 1+2+...+i,当 i 为奇数时累乘 1×2×...×i,最后依次输出 a[1]a[8]。核心方法是双重循环,时间复杂度为 O(n^2)
21. 把第 06 行改为 f=i&1;,不影响运行结果。( )
A. TRUE
B. FALSE
答案:A。对正整数 ii%2i&1 都能判断奇偶性,结果同为 0 或 1。
22. 删除第 02 行,程序仍然能运行。( )
A. TRUE
B. FALSE
答案:A。本程序没有使用 cincout 等需要 std:: 命名空间限定的对象,因此删除 using namespace std; 不影响这段程序的主要运行逻辑。
23. f 只有 0/1 两种取值。( )
A. TRUE
B. FALSE
答案:A。第 06 行 f=i%2,整数除以 2 的余数只可能是 0 或 1。
24. 输出为 1 3 6 10 120 21 5040 36。( )
A. TRUE
B. FALSE
答案:A。当 i 为偶数时,a[i]1+2+...+i;当 i 为奇数时,a[i]1×2×...×i。所以 a[1..8] 依次为 1,3,6,10,120,21,5040,36
25. 程序的时间复杂度为( )
A. O(n^2)
B. O(2^n)
C. O(n)
D. O(nlogn)
答案:A。外层循环执行 n 次,内层循环第 i 次执行 i 次,总次数为 1+2+...+n,因此时间复杂度为 O(n^2)
阅读下面程序,回答第 26~30 题。
阅读程序
  1. #include <cstdio>
  2. using namespace std;
  3. int ack(int m,int n){
  4. if(m==0)return n+1;
  5. else if(n==0)return ack(m-1,1);
  6. else return ack(m-1,ack(m,n-1));
  7. }
  8. int main(){
  9. printf("%d\n",ack(3,4));
  10. putchar('\n');
  11. return 0;
  12. }
代码功能:这段程序递归实现 Ackermann 函数,并输出 ack(3,4) 的值。算法核心是按 m==0n==0 和一般情况分三类递归,其中一般情况会先计算 ack(m,n-1),再作为参数继续计算 ack(m-1,...),递归增长非常快。
26. 第 09 行的 ack(3,4) 改为 ack(-1,-1),程序能正常出结果。( )
A. TRUE
B. FALSE
答案:B。函数只在 m==0n==0 时有明确的终止路径。若从 ack(-1,-1) 开始,参数会继续向负数方向递归,无法正常到达基本情况。
27. ack 函数增长很慢。( )
A. TRUE
B. FALSE
答案:B。Ackermann 函数是经典的增长极快的递归函数,增长速度远快于普通多项式函数。
28. 程序输出为( )
A. 125
B. 250
C. 114
D. 514
答案:A。由定义可推出 ack(1,n)=n+2ack(2,n)=2n+3ack(3,n)=2^(n+3)-3,所以 ack(3,4)=2^7-3=125
29. 将第 09 行 ack(3,4) 修改为 ack(2,5),输出将为( )
A. 125
B. 13
C. 130
D. 26
答案:B。根据 ack(2,n)=2n+3,可得 ack(2,5)=2×5+3=13
30. 将第 09 行 ack(3,4) 修改为 ack(1,4),输出将为( )
A. 125
B. 13
C. 8
D. 6
答案:D。由定义可得 ack(1,n)=n+2,所以 ack(1,4)=6
三、完善程序题(共5题,每题4分,共20分)
补全程序,使其统计十进制正整数转换为二进制后有多少位为 1。
题目说明

输入一个十进制正整数 n,然后将 n 转换为二进制数,最后统计二进制数的各位数字,看有多少位为 1,然后打印出总数。

输入样例:127输出样例:7。十进制数 127 转换为二进制数 1111111,共有 7 个 1。

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. int a[33],cnt;
  4. int main()
  5. {
  6. int n,sum,x;
  7. cin>>n;
  8. cnt=0;
  9. ①;
  10. while(x>0)
  11. {
  12. a[②]=x%2;
  13. ③;
  14. }
  15. sum=0;
  16. for(int i=1;④;i++)
  17. if(a[i]==1)
  18. ⑤;
  19. cout<<sum<<endl;
  20. return 0;
  21. }
代码功能:这段程序用“不断除以 2 取余”的方法把十进制整数拆成二进制位,并把每一位存入数组 a。随后遍历这些二进制位,遇到 1 就让 sum 加一,最终输出二进制表示中 1 的个数。核心算法是短除法取二进制位,时间复杂度为 O(log n)
31. ①处应填( )。
A. x=n
B. x=1
C. x=0
D. x=n-1
答案:A。后面的循环要不断对 x 除以 2 来取二进制各位,因此一开始要把输入的 n 赋给 x
32. ②处应填( )。
A. --cnt
B. ++cnt
C. cnt--
D. cnt
答案:B。每得到一位二进制位,就要把位数计数器 cnt 加 1,并把当前位存入新的位置,所以用 a[++cnt]
33. ③处应填( )。
A. x/=2
B. n++
C. x++
D. n--
答案:A。取出当前最低位 x%2 后,要把 x 除以 2,继续处理下一位。
34. ④处应填( )。
A. i<cnt
B. i<cnt/2
C. i<=cnt
D. i<=cnt/2
答案:C。二进制位存放在 a[1]a[cnt] 中,统计时应遍历全部这些位置,所以循环条件是 i<=cnt
35. ⑤处应填( )。
A. sum--
B. sum=x
C. sum=0
D. sum++
答案:D。当当前二进制位等于 1 时,应把答案计数器 sum 加 1。