在线评测链接
题目描述
\qquad 塔子哥这学期有一门专业必修课,叫做汇编语言,这不准备结课了嘛,老师布置了一个大作业,要求设计一种虚拟机解释器,能解析并执行以下虚拟指令。
\qquad 虚拟机约定:32位的整形寄存器有 a 0 a_0 a0, a 1 a_1 a1,… a 31 a_{31} a31,共32个寄存器;
\qquad 整个虚拟机只有寄存器和立即数参与计算。
\qquad 规则集(dst一定为寄存器,src为寄存器或十进制正整数,运算结果存在负数场景):
\qquad (1)MOV dst src \quad 含义:dst = src
\qquad (2)ADD dst src0 src1 \quad 含义:dst = src0 + src1
\qquad (3)SUB dst src0 src1 \quad 含义:dst = src0 - src1
\qquad (4)MUL dst src0 src1 \quad 含义:dst = src0 * src1
\qquad (5)DIV dst src0 src1 \quad 含义:dst = src0 / src1(结果向下取整)
\qquad (6)PRINT dst \quad 含义:打印dst寄存器值
\qquad 规定:不用考虑计算溢出(用例保证),指令数最多100条,至少一条PRINT指令,寄存器保证先赋值再引用。不用考虑小数以及除0错误。
输入描述
\qquad 若干行,每行一条指令
输出描述
\qquad 对输入的每行指令,若为PRINT指令,则输出打印一行,该行中包括一个整数,表示寄存器的值
样例一
输入
MOV a1 100
MOV a2 200
ADD a3 a1 100
SUB a4 a3 a2
PRINT a4
输出
0
解释
a1=100
a2=200
a3=a1(100)+100=200a4=a3(200)-a2(200)=0
样例二
输入
MOV a1 100
MOV a2 200
PRINT a1
ADD a3 a1 100
SUB a4 a3 a2
PRINT a4
输出
100
Limitation
1s, 1024KiB for each test case.
思路
模拟题,根据题意模拟即可。
需要注意的几个点:
- 题目并未事先确定输入的行数,所以需要读到末尾 EOF 为止
- 在进行 ADD 和 SUB 操作时,并不知道两个数是以寄存器形式还是立即数形式给出,所以需要判断出来,然后获取到对应的数值进行计算即可
- 除法操作下取整,C++ 的除法是向零取整,需要自行处理成向下取整
时间复杂度: O ( n ) O(n) O(n) , n n n 为输入的行数
代码
import sys
d = dict()
for line in sys.stdin:
lst = line.split()
if lst[0] == "MOV":
d[lst[1]] = int(lst[2]) if lst[2].isdigit() else d[lst[2]]
elif lst[0] == "PRINT":
print(int(lst[1]) if lst[1].isdigit() else d[lst[1]])
else:
v1 = int(lst[2]) if lst[2].isdigit() else d[lst[2]]
v2 = int(lst[3]) if lst[3].isdigit() else d[lst[3]]
if lst[0] == "ADD":
d[lst[1]] = v1 + v2
elif lst[0] == "SUB":
d[lst[1]] = v1 - v2
elif lst[0] == "MUL":
d[lst[1]] = v1 * v2
elif lst[0] == "DIV":
d[lst[1]] = v1 // v2