28700: 罗马数字与整数的转换
http://cs101.openjudge.cn/practice/28700/
罗马数字包含以下七种字符:I、V、X、L、C、D和M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如, 整数2写做II,即为两个并列的I。12写做XII,即为X+II。 27写做XXVII, 即为 XX+V+II。
通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如4不写做IIII,而是IV。I在V的左边,所表示的数等于大数5减小数1得到的数值4。同样地,数字9表示为IX。这个特殊的规则只适用于以下六种情况: I 可以放在 V (5) 和 X (10) 的左边,来表示4和9。 X 可以放在 L (50) 和 C (100) 的左边,来表示40和90。 C 可以放在 D (500) 和 M (1000) 的左边,来表示400和900。
题目要求:实现罗马数字和整数的转换。 1)如果输入是一个罗马数字,将其转换成整数; 2)如果输入是一个整数,将其转换为罗马数字。 无论是何种输入,整数在1到3999的范围内。
输入输出示例:
输入:III
输出:3
输入:4
输出:IV
输入:IX
输出:9
输入:58
输出:LVIII
输入:MCMXCIV
输出:1994
(M = 1000, CM = 900, XC = 90, IV = 4)
输入
一行字符(可能是罗马数字,也可能是正整数)
输出
如果输入是罗马数字,输出是正整数; 如果输入是正整数,输出是罗马数字。
样例输入
MCMXCIV样例输出
1994提示
tags: implementation 整数是正整数,数值范围1~3999。罗马数字中的字符是大写的。 可采用第一个字符判断输入是整数(0~9)还是罗马数字(不是0~9)。
来源
2024 TA-xjk
定义一个字典,映射罗马字符到对应的整数值。遍历输入的罗马数字字符,如果当前字符的值小于下一个字符的值,则表示应该减去当前字符的值;否则加上当前字符的值。
定义一个包含罗马数字及其对应值的列表,按从大到小的顺序排列使用循环和整除操作,将整数分解为相应的罗马字符,直到将其完全转换。
# 定义罗马数字和整数的映射关系
roman_to_int_map = {
'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000
}
# 定义整数到罗马数字的映射列表 (从大到小顺序)
int_to_roman_map = [
(1000, 'M'), (900, 'CM'), (500, 'D'), (400, 'CD'),
(100, 'C'), (90, 'XC'), (50, 'L'), (40, 'XL'),
(10, 'X'), (9, 'IX'), (5, 'V'), (4, 'IV'), (1, 'I')
]
# 罗马数字转整数
def roman_to_int(s):
total = 0
prev_value = 0
for char in s:
value = roman_to_int_map[char]
if value > prev_value:
total += value - 2 * prev_value # 处理特殊情况,如IV, IX
else:
total += value
prev_value = value
return total
# 整数转罗马数字
def int_to_roman(num):
result = []
for value, symbol in int_to_roman_map:
while num >= value:
result.append(symbol)
num -= value
return ''.join(result)
# 主函数,判断输入是罗马数字还是整数
def main():
# 输入处理
input_data = input().strip()
# 判断输入是整数还是罗马数字
if input_data.isdigit():
# 输入是整数
num = int(input_data)
print(int_to_roman(num))
else:
# 输入是罗马数字
print(roman_to_int(input_data))
# 调用主函数
if __name__ == "__main__":
main()