# P2 课上测试游记

通过阅读本文,您可以大致了解 2021 年秋季北航计算机组成课程 P2 课上测试的题目内容、难度和解题思路
P2 课上测试的主要内容是利用 MIPS 汇编语言翻译 C 语言程序
题目每年都会发生变化,题意描述大致清晰,但是可能与原题有一定差异

P2 课上测试非常简单,想要通过与 C 语言基础没有任何联系,只需要掌握翻译 C 语言代码的技巧,手速再快一点,1.5h 之内 AK 还是挺容易的

而且本次考试时间是 2.5h... 难度虚高了

# T1 删数问题

题目已经给出了 C 语言代码,否则应该还是一道挺有思考难度的题目

给出一个nn 位数SS,要从中删去NN 个数字,要求得到新数字nNn-N 位数ss 最小

题目输入 nnSSNN,要求输出 ss

题目来源:洛谷 P1106 删数问题,链接甩在这里了 P1106 删数问题 - 洛谷,详细解答可以参考原题解

输入输出样例

输入 #1

175438 
4

输出 #1

13

话说连输入输出都没变...

正确做法是贪心,每次从最高位开始寻找一个下降区间,删去下降区间的第一个数字,则可以证明这样的做法留下的数字最小

但是根本不用去思考正解,因为按照题目要求翻译就行了...

# T2 分解求和

题目稍显简单,根本找不到原题(毕竟数据范围只有0<n<190<n<19,然而我第一次 TLE 了...)

这一题其实比 T1 容易

给定一个数nn按照字典序输出它所有可能的加法拆分(满足交换律算一种)

输入输出样例

输入 #1

5

输出 #1

1+1+1+1+1
1+1+1+2
1+1+3
1+2+2
1+4
2+3

简单 DFS,暴力出奇迹

还有 C 代码,懒省事可以照着直接翻译

# T3 双关键字排序

听说前几年考过快排,考试之前我还手写练习了归并排序,然而这次没考,考了冒泡排序...

给定nn 组数据,每个数据由aia_ibib_i 两个数组成,对nn 组数据进行排序,其中首先按照aia_i 的大小从小到大排序,aia_i 相同按照bib_i 从小到大排序

输入数据包括2n+12n+1 行,第 1 行是一个整数,表示数据组数nn,从第 2 行到第2n+12n+1 行,每行一个整数,依次表示a1,b1,a2,b2,...,an,bna_1,b_1,a_2,b_2,...,a_n,b_n

输出应当包括nn 行,每行 2 个整数,用空格隔开,分别是排完序后的a_{i_1},b_

为了降低难度,甚至题面给出了冒泡排序的 C 语言代码

我用了封装好的数组和输入输出宏,但是貌似过度封装了,所以指令数爆了,不用宏了之后就过了...

思路就是冒泡直接翻译,并没有啥

# T4 调试题:回文串

回文串其实是课下题,但是这个选择我又错了,但是我不知道为啥读一个字符用 4 位还是对的...

别的错误很好找,一个是数组最大下标是len(str)1\mathrm{len}(str)-1,另一个是跳转之后会继续执行下面的指令,所以输出 Right 之后会接着输出 Wrong ...

# 提答

助教提问,你不会也会让你过...... 主要内容包括且不限于

  • 各种寄存器 $fp$k0$k1$sp 等等...
  • Mars 基本操作
  • 代码思路