#P1588. Reverse Roman Notation

Reverse Roman Notation

本题没有可用的提交语言。

描述

赫尔墨斯波塞冬 (HP) 公司推出了一款新型计算器 HP CXX,它采用了最新的现代技术。它支持对从 IIMMMMCMXCIXMMMMCMXCIX 的整数值进行四则基本算术运算。

在本题中,您将模拟 HP CXX。每行输入要么是一个正整数的罗马数字表示(介于 II(1) 和 MMMMCMXCIXMMMMCMXCIX(4999) 之间),然后将其推送到虚拟堆栈的顶部;要么是对堆栈顶部两个值执行的算术运算 (++ - * //)。此外,还有 = 运算,该运算请求打印堆栈顶部的值(当然,以罗马数字表示)。

对于 - 运算,用堆栈中的第二个数字减去第一个数字。对于 // 运算,用堆栈中的第二个数字除以第一个数字。尝试除以 0 会导致错误消息“除以零异常”。发生这种情况时,将被除数(非零数)压回堆栈,但除数(零)不压回。

如果请求执行操作,而堆栈中的数字不足,则打印错误“堆栈下溢”,并保持堆栈不变。这适用于二进制运算 +/+-*/ 和打印运算 ==

如果尝试打印一个小于或等于 0 的数字,或者大于 MMMMCMXCIXMMMMCMXCIX(4999) 的数字,则显示错误消息“超出范围异常”,并继续输入下一行。

罗马数字

对于不熟悉罗马数字的人,以下是简要概述:

罗马数字中使用的每个字母代表不同的数字:

Roman Numeral Number

--------------------------

I 1

V 5

X 10

L 50

C 100

D 500

M 1000

一串字母表示它们的值应该相加。例如,XXX=10+10+10=30XXX = 10 + 10 + 10 = 30LXI=50+10+1=61LXI = 50 + 10 + 1 = 61。如果较小的值放在较大的值前面,

我们会用减法代替加法。例如,IV=51=4IV = 5 − 1 = 4XC=10010=90XC = 100 − 10 = 90

除了 MM 之外,不要将超过三个相同的字母相加。

只能减去 10 的幂,例如 IIXXCC。45 不允许写成 VLVL:应该写成 XLVXLV。 一个数字只能减去一个字母。8 写成 VIIIVIII,而不是 IIXIIX;19 写成 XIXXIX,而不是 IXXIXX。 不要用一个字母减去另一个大于 10 倍的字母。这意味着你只能用 VVXX 减去 II,用 LLCC 减去 XX,所以 MIM 是非法的。

输入

每行输入包含以下任一内容:

IIMMMMCMXCIXMMMMCMXCIX 之间的罗马数字,或 算术运算符 ++-//*,或打印运算符 == 输入结束于文件末尾。

输出

将输出一行:

对于每个打印操作,打印堆栈顶部的值,或 单独一行显示一条错误消息: 除零异常 堆栈下溢 超出范围异常 不应生成其他输出

I
I
+
=
II
*
=
VIII
-
=
II
IV
out of range exception