题目:整数转罗马数字
七个不同的符号代表罗马数字,其值如下:
符号 | 值 |
---|---|
I | 1 |
V | 5 |
X | 10 |
L | 50 |
C | 100 |
D | 500 |
M | 1000 |
罗马数字是通过添加从最高到最低的小数位值的转换而形成的。将小数位值转换为罗马数字有以下规则:
- 如果该值不是以 4 或 9 开头,请选择可以从输入中减去的最大值的符号,将该符号附加到结果,减去其值,然后将其余部分转换为罗马数字。
- 如果该值以 4 或 9 开头,使用 减法形式,表示从以下符号中减去一个符号,例如 4 是 5 (
V
) 减 1 (I
):IV
,9 是 10 (X
) 减 1 (I
):IX
。仅使用以下减法形式:4 (IV
),9 (IX
),40 (XL
),90 (XC
),400 (CD
) 和 900 (CM
)。 - 只有 10 的次方(
I
,X
,C
,M
)最多可以连续附加 3 次以代表 10 的倍数。你不能多次附加 5 (V
),50 (L
) 或 500 (D
)。如果需要将符号附加4次,请使用 减法形式。
给定一个整数,将其转换为罗马数字。
思路:枚举所有罗马字符以及对应的数值,然后按照取值从大到小排序,从大到小取匹配取值所在的区间。
代码:
class Solution:
def intToRoman(self, num: int) -> str:
integer_roman_mapping = {
1: "I",
5: "V",
10: "X",
50: "L",
100: "C",
500: "D",
1000: "M",
4: "IV",
9: "IX",
40: "XL",
90: "XC",
400: "CD",
900: "CM",
}
integer_roman_mapping = dict(
sorted(integer_roman_mapping.items(), reverse=True)
)
print(integer_roman_mapping.items())
res = []
for key, val in integer_roman_mapping.items():
while num >= key:
num -= key
res.append(val)
if num == 0:
break
return "".join(res)
s1 = Solution()
num = 3749 # "MMMDCCXLIX"
res = s1.intToRoman(num)
print(res)