Skip to content

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

定义一个字典,映射罗马字符到对应的整数值。遍历输入的罗马数字字符,如果当前字符的值小于下一个字符的值,则表示应该减去当前字符的值;否则加上当前字符的值。

定义一个包含罗马数字及其对应值的列表,按从大到小的顺序排列使用循环和整除操作,将整数分解为相应的罗马字符,直到将其完全转换。

python
# 定义罗马数字和整数的映射关系
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()