因为近日在准备保研的刷题…所以得看各种奇怪的题目。但事实上由于太久没有写算法了,现在还在康复期,先做些简单的东西好了…其实是我觉得这个东西什么时候可能会用上?

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
def intToRoman(self, num: int) -> str:
string = ""
ones = ["I", "X", "C", "M"]
fives = ["V", "L", "D"]
ct = 0
while num:
n = num % 10
s = ""
if n <= 3:
s = ones[ct] * n
elif n == 4:
s = ones[ct] + fives[ct]
elif n <= 8:
s = fives[ct] + ones[ct] * (n - 5)
elif n == 9:
s = ones[ct] + ones[ct + 1]
string = s + string
ct += 1
num //= 10
return string

阿拉伯数字转罗马数字规则

符号 数字
I 1
V 5
X 10
L 50
C 100
D 500
M 1000

例如以下的对应:

罗马数字 阿拉伯数字
III 3
VI 6
XVI 16

特殊规则
除了上述简单的累计外,还有一条特殊规则:对于$4\times 10^n$或$9\times 10^n$,应该使用特殊的表达方法:

罗马数字 阿拉伯数字
IV 4
IX 9
XL 40
XC 90

在这个规则下,MCMXCIV代表 1994:M:1000;CM:900;XC:90;IV:4。这意味着对于一个阿拉伯数字,最多需要 4 个符号,但基本上还是遵循十进制的规律,所以毫无竞争力可言。