2025年北京航空航天大学计算机考研复试机试真题
本文整理北京航空航天大学计算机考研机试真题,并提供详细解析与代码实现,帮助同学们了解保研机试的难度与题型分
模拟编译系统
题目描述
该程序会模拟一个解释运行的编译系统,每次从标准输入中读入一行指令,都要进行对应的操作,该程序中存在四种语句,语句最长 $200$ 个字符,每个语句占且仅占一行,每行最多一个语句。
四种语句分别如下:
-
输入语句,格式为 $read$ + 空格 + $<$ 变量序列 $>$ + 换行符,变量序列是以空分隔的变量名称的组合,变量的名字只可能为单个的小写字母,变量不需要前声明,紧接着下一行,输入若干十进制整数,每个整数和上一行的变量对应赋值。
-
赋值语句,格式为 $变量$ + $等于符号$ + $表达式$ + 换行符,表达式中包含十进制整数,变量,$+$ $-$ $*$ $/$ $($ $)$ 这六种计算符号,整个语句不包含空白符。
-
输出语句,格式为 $print$ + 空格 + $<$ 变量序列 $>$ + 换行符,紧接着下一行,输出若干个变量的值,值以浮点数形式输出,保留两位小数,值之间以空格分隔,最后一个值后面不跟空格跟换行符。
-
结束语句,格式为 $exit$ + 换行符,该语句后直接结束程序运行。
测试样例中,所有语句均不包含语法错误,所有变量在使用前均会赋值(不需要考虑输入错误的情况)。
输入格式
见题目
输出格式
见题目
输入样例
read a
10
b=20
c=(a+b)/4
print a b c
exit
输出样例
10.00 20.00 7.50
空闲块
题目描述
在操作系统中,空闲存储空间通常以空闲块链表方式组织,每个块包含块起始位置、块长度及一个指向下一块的指针。
空闲块按照存储位置升序组织,最后一块指向第一块(构成循环链表)。
当有空间申请请求时,按照如下原则在空闲块循环链表中寻找并分配空闲块:
1)从当前位置开始遍历空闲块链表(初始是从地址最小的第一个空闲块开始),寻找满足条件的最小块(即:大于等于请求空间的最小空闲块,如果有多个大小相同的最小空闲块,则选择遍历遇到的第一个空闲块)(最佳适应原则);
2)如果选择的空闲块恰好与请求的大小相符合,则将它从链表中移除并返回给用户;这时当前位置变为移除的空闲块指向的下一空闲块;
3)如果选择的空闲块大于所申请的空间大小,则将大小合适的空闲块返回给用户,剩下的部分留在空闲块链表中;这时当前位置仍然为该空闲块;
4)如果找不到足够大的空闲块,则申请失败;这时当前位置不变。
例如:下图示例给出了空闲块链表的初始状态,每个结点表示一个空闲块,结点中上面的数字指空闲块的起始位置,下面的数字指空闲块的长度,位置和长度都用正整数表示,大小不超过 $int$ 表示范围。
当前位置为最小地址为 $1024$ 的空闲块。

若有 $4$ 个申请空间请求,申请的空间大小依次为:$1024$、$2560$、$10240$ 和 $512$。
则从当前位置开始遍历上图的链表,按照上述原则寻找到满足条件的最小块为地址是 $16384$ 的空闲块,其长度正好为 $1024$,所以将其从链表中删除,这时链表状态如下图所示,当前位置变成地址为 $32768$ 的空闲块。

从当前位置开始为第二个空间请求(大小为 $2560$)遍历链表,按照上述原则寻找到满足条件的最小块为地址是 $80896$ 的空闲块,其长度为 $3072$,大于请求的空间大小,于是申请空间后该空闲块剩余的长度为 $512$,当前位置为地址是 $80896$ 的空闲块,链表状态如下图所示:

从当前位置开始为第三个空间请求(大小为 $10240$)遍历链表,遍历一圈后发现找不到足够大的空闲块,则忽略该请求,当前位置不变。
下面继续为第四个空间请求(大小为 $512$)遍历链表,按照上述原则寻找到满足条件的最小块为当前位置的空闲块,其长度等于请求的空间大小,于是将该空闲块删除后,链表状态变为下图所示:

编写程序,模拟上述空闲空间申请。
输入格式
第一行包含正整数 $N$,表示空闲块个数。
接下来 $N$ 行,每行包含两个正整数,按照起始位置由小到大的顺序依次描述每个空闲块的起始位置和长度。
最后一行包含若干正整数,按照申请的先后顺序依次描述每个申请的空间大小,最后以一个 -1 表示结束。
输出格式
按照上述原则模拟完空闲空间申请后,输出当前空闲空间链表状态,即从当前位置开始,遍历链表,分行输出剩余空闲块的起始位置和长度,位置和长度之间以一个空格分隔。
若申请完后,链表中没有空闲块,则什么都不输出。
数据范围
$1 \leq N \leq 100$
申请请求的个数范围 $[1,100]$,
每个空闲块的起始位置和长度以及每个申请的空间大小的取值范围 $[1,10^9]$。
输入样例
12
1024 2048
8192 512
16384 1024
32768 8192
65536 8192
77824 1024
80896 3072
86016 1024
91136 5120
99328 512
104448 1024
112640 3072
1024 2560 10240 512 1024 6400 512 -1
输出样例
104448 1024
112640 3072
1024 2048
8192 512
32768 1792
65536 8192
77824 1024
91136 5120
连续合数段
题目描述
给定区间 $[a,b]$,输出这个区间里最长的连续合数段。
输入格式
一行,两个整数 $a$,$b$。
输出格式
一行,输出最长的连续合数段。
如果答案不唯一,则输出首项最小的那一段。
数据范围
$1 \leq a \leq b \leq 10000$
输入样例
1 10
输出样例
8 9 10
等差序列
题目描述
给定闭区间 $[a,b]$ ,要求输出连续的素数的等差序列,三个以上才算是序列,例如 $[100,200]$ 会输出 $151$ $157$ $163$
再例如输入 $[1,100]$ 会有两个等差序列,$3$ $5$ $7$ 和 $47$ $53$ $59$。
输出样式行末的空格保留。
输入格式
输入两个正整数 $a$ 和 $b$,其中 $a$ 和 $b$ 小于等于 $10000$。
输出格式
参考输出样例
输入样例
141 400
输出样例
151 157 163
167 173 179
199 211 223
251 257 263 269
367 373 379
三叉树
题目描述
一个关于三叉树的题目,小于 $100$ 的值代表树叶,大于 $100$ 的值为分支点,建树的过程是水平方向建树。
输入格式:
先输入 $n$,代表有 $n$ 组数据,接下来 $n$ 行,输入 $4$ 个数,第一个数代表根节点,接下来分别代表三个子节点,$-1$ 代表子节点不存在,输入的顺序按照层次遍历的次序。
接下来,要求寻找叶子节点的最短路径,最短路径是指不经过重复的边。
输入方式,首先输入一个值 $m$,代表 $m$ 行,接下来 $m$ 行输入 $m$ 个叶子节点和对应的优先级,要求按优先级输出从上次到达的位置到该节点的最短路径,每条路径的最后一个节点要求输出目标叶子节点,最后要求回到根节点。
输入格式
见题目描述
输出格式
见输出样例
输入样例
10
100 101 108 107
101 1 102 2
108 103 104 105
107 17 109 18
102 3 4 5
103 7 8 9
104 10 106 11
105 15 16 -1
109 19 20 21
106 12 13 14
5
8 1
14 3
16 2
5 0
19 4
输出样例
100 101 102 5
102 101 100 108 103 8
103 108 105 16
105 108 104 106 14
106 104 108 100 107 109 19
109 107 100