问题:
七个不同的符号代表罗马数字,其含义如下:
| 罗马数字 | 十进制数 |
|---|---|
| 我 | 1 |
| 五 | 5 |
| 十 | 10 |
| 大号 | 50 |
| 碳 | 100 |
| 德 | 500 |
| 米 | 1000 |
罗马数字是由十进制数值从最高位到最低位相加转换而成的。小数位数值转换为罗马数字有以下规则:
如果值不是以 4 或 9 开头,请选择可以从输入中减去的最大值的符号,将该符号添加到结果中,减去其值,然后将余数转换为罗马数字。
如果值以 4 或 9 开头,则使用减法形式,表示从下一个符号中减去一个符号,例如 4 减 1(I)小于 5(V):IV,9 减 1(I)小于 10(X):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 次,请使用减法形式。
给定一个整数,将其转换为罗马数字。
示例 1:
Ввод: число = 3749
Вывод: "MMMDCCXLIX"
Объяснение:
3000 = МММ как 1000 (М) + 1000 (М) + 1000 (М)
700 = DCC как 500 (D) + 100 (C) + 100 (C)
40 = XL как 10 (X) меньше 50 (L)
9 = IX как 1 (I) меньше 10 (X)
Примечание: 49 не на 1 (I) меньше 50 (L), поскольку преобразование основано на десятичных знаках.
示例 2:
Ввод: число = 58
Вывод: "LVIII"
Объяснение:
50 = L, 8 = VIII
示例 3:
Ввод: число = 1994
Вывод: "MCMXCIV"
Объяснение:
1000 = М
900 = СМ
90 = ХС
4 = IV
限制:
1 <= num <= 3999
链接:
https://leetcode.com/problems/integer-to-roman/description/
我最近为这个任务写了一些代码。关键特性是我决定不向表中不存在的元组添加值(None 除外)。结果如下:
def int_to_roman(num):
result = []
nums = (1000, 500, 100, 50, 10, 5, 1, None)
roman_nums = ('M', 'D', 'C', 'L', 'X', 'V', 'I')
while not num == 0:
for max_deductible in nums:
# Находим такое наибольшее вычитаемое, которое будет меньше либо равно num
if max_deductible <= num:
# Сохраняем индекс вычитаемого
max_deductible_index = nums.index(max_deductible)
break
# Сохраняем предыдущее число (до max_deductible)
previous_num = nums[max_deductible_index - 1]
flag = len(str(max_deductible)) == len(str(previous_num))
# Выбор вычитаемого из next_num, которое подходит для данного случая
possibly_deductible = (nums[max_deductible_index + 1], max_deductible)[flag]
# Если существует число менее num и более max_deductible (в nums)
if all((possibly_deductible, previous_num)) and previous_num - possibly_deductible <= num:
num -= (previous_num - possibly_deductible)
possibly_deductible_index = nums.index(possibly_deductible)
# В римском вычитании сначала ставится вычитаемое, а потом уменьшаемое
result.append(roman_nums[possibly_deductible_index] +
roman_nums[max_deductible_index - 1])
else: # Если такого числа не существует, вычитаем max_deductible
num -= max_deductible
result.append(roman_nums[max_deductible_index])
return ''.join(result) # Возращаем результат
我很乐意听到任何批评。但重要的是要明白,我最近才进入这个领域,因此我不应该建议任何来自库/框架的功能或方法。