整数转罗马数字
题目地址:整数转罗马数字
题目描述
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。
字符 数值
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。
通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 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 到 3999 的范围内。
示例 1:
输入: 3
输出: "III"
示例 2:
输入: 4
输出: "IV"
示例 3:
输入: 9
输出: "IX"
示例 4:
输入: 58
输出: "LVIII"
解释: L = 50, V = 5, III = 3.
示例 5:
输入: 1994
输出: "MCMXCIV"
解释: M = 1000, CM = 900, XC = 90, IV = 4.
思路
- 暴力分类讨论:遍历数字的每一位,判断该位是个位、十位、百位还是千位,然后执行相应的转换操作;
- 采用
数字-字符
结构的字典存储关键数字(进位有关)与对应字符的映射关系,然后用给定数字对这些关键数字依次取模,取模结果乘以该关键数字对应的字符
代码
暴力分类讨论
def intToRoman(num: int) -> str:
string_1 = ''
string_2 = ''
string_3 = ''
string_4 = ''
index = 1
while num:
x = num % 10
num //= 10
# 个位
if index == 1:
if x == 0:
string_1 += ''
elif x == 4:
string_1 += 'IV'
elif x == 9:
string_1 += 'IX'
elif 1 <= x <= 3:
while x:
string_1 += 'I'
x -= 1
elif 5 <= x <= 8:
x -= 5
string_1 += 'V'
while x:
string_1 += 'I'
x -= 1
# 十位
elif index == 2:
if x == 0:
string_2 += ''
elif x == 4:
string_2 += 'XL'
elif x == 9:
string_2 += 'XC'
elif 1 <= x <= 3:
while x:
string_2 += 'X'
x -= 1
elif 5 <= x <= 8:
x -= 5
string_2 += 'L'
while x:
string_2 += 'X'
x -= 1
# 百位
elif index == 3:
if x == 0:
string_3 += ''
elif x == 4:
string_3 += 'CD'
elif x == 9:
string_3 += 'CM'
elif 1 <= x <= 3:
while x:
string_3 += 'C'
x -= 1
elif 5 <= x <= 8:
x -= 5
string_3 += 'D'
while x:
string_3 += 'C'
x -= 1
# 千位,只有1,2,3三种情况
if index == 4:
while x:
string_4 += 'M'
x -= 1
index += 1
string = string_4 + string_3 + string_2 + string_1
print(string)
return string
优化暴力分类讨论
def intToRoman2(num: int) -> str:
string = ''
index = 1
while num:
x = num % 10
if index == 1:
string = str_of_num(x, 'I', 'V', 'X') + string
elif index == 2:
string = str_of_num(x, 'X', 'L', 'C') + string
elif index == 3:
string = str_of_num(x, 'C', 'D', 'M') + string
else:
string_4 = ''
while x:
string_4 += 'M'
x -= 1
string = string_4 + string
num //= 10
index += 1
print(string)
return string
# 复用分类讨论代码
def str_of_num(x, a, b, c):
string = ''
if x == 0:
string += ''
elif x == 4:
string += a + b
elif x == 9:
string += a + c
elif 1 <= x <= 3:
while x:
string += a
x -= 1
elif 5 <= x <= 8:
x -= 5
string += b
while x:
string += a
x -= 1
return string
设置映射表,从高位到低位转换
def intToRoman3(num: int) -> str:
res = ''
# 数值和字符映射关系
num_str_dic = {
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'
}
# x 是字典中的健,这里是数字
for x in num_str_dic:
# 用num整除 num_str_dic 中的数值,得到的数乘以对应的符号
#(如:2*I=II,如果是0*I,就是"")
res += num // x * num_str_dic[x]
num %= x
return res
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 changzeyan@foxmail.com