2024年5月8日-暑期实习-第一题(100分)-塔子哥的汇编作业

在线评测链接

题目描述

\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
  • 21
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

塔子哥学算法

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值