题目:给定一个整数,将其转换为罗马数字。 输入保证在1到3999的范围内。罗马数字是由七个不同的符号来表示: I
,V
,X
,L
,C
,D
和M
。对应关系如下:
罗马数字的构造规则:
- 2用罗马数字写成II,是两个1加在一起。 12写为XII,简称为X + II。 第二十七号写成XXVII,即XX + V + II。
- 罗马数字通常从左到右由最大到最小。 但是,4不是IIII。 而是IV。因为4是5前面的一个数字。 同样的原则适用于9,即IX。 有六个使用减法的实例:可以I放在V(5)和X(10)之前制作4和9。X可以放在L(50)和C(100)之前,以产生40和90。C可以放在D(500)和M(1000)之前,以产生400和900。
例子如下:
- Example 1: Input: 3 Output: "III"
- Example 2: Input: 4 Output: "IV"
- Example 3: Input: 9 Output: "IX"
- Example 4: Input: 58 Output: "LVIII" Explanation: L = 50, V = 5, III = 3.
- Example 5: Input: 1994 Output: "MCMXCIV" Explanation: M = 1000, CM = 900, XC = 90 and IV = 4.
思路:首先可以将罗马数字的七个不同符号存储在字典中,我们可以通过不断进行除法,取余……来获取整数对应的数字。例如1632,先1232=1*1000+1*500+1*100+0*50+3*10+2*1,所以罗马数字为MDCXXXII。但是对于特殊情况,存在400,40,4的这种情况,不是直接输出4个100,4个10,4个1,所以我们可以将特殊情况存在另一个字典里,直接取出对应的特殊情况添加到输出的罗马字符串中。此外,对于特殊情况900,90,9 这类不能写成500+?,50+?,5+?,所以不能对500,50,5进行整除。
代码实现如下:
class Solution:
def intToRoman(self, num: int) -> str:
s=''
doc={1000:'M',500:'D',100:'C',50:'L',10:'X',5:'V',1:'I'}
doc2={4:'IV',9:'IX',40:'XL',90:'XC',400:'CD',900:'CM'}
for key in doc:
if (num>=900 and num<1000) or (num>=90 and num<100) or (num==9):
if key in [500,50,5]:
continue
q=num//key
if q!=0:
num=num%key
if q*key in doc2:
s+=doc2[q*key]
else:
for i in range(q):
s+=doc[key]
return s