Перевод из арабских в римские числа
Начинающий только в пайтоне,помогите упростить програму,ибо понимаю что слишком много ифов,как это можно сделать проще? Прога работает (1-3999) но выглядит просто ужасно
line='';
line=int(input(line));
print(line);
line2="";
tysyach=line//1000%10 #M
sot=line//100%10 #C
desyat=line//10%10 #L
odynych=line%10 #I
if(tysyach!=None):
line2 = "M" * tysyach;
print(line2);
if(sot !=None):
if (sot == 9):
line2 += "CM"
elif (sot == 4):
line2 += "CD"
elif (sot > 4):
line2 += "D" + "C" * (sot - 5)
else:
line2 += "C" * sot;
print(line2);
if(desyat!=None):
if (desyat == 9):
line2 += "XC"
elif (desyat == 4):
line2 += "XL"
elif(desyat>4):
line2 += "L"+"X"*(desyat-5)
else:
line2+="X"*desyat;
if(odynych!=None):
if(odynych==4):
line2+="IV";
elif(odynych>5 and odynych<9):
line2+="V"+(odynych-5)*"I"
elif(odynych==5):
line2 += "V"
elif (odynych == 9):
line2 += "IX"
else:
line2+="I"*odynych;
print(line2);
Ответы (2 шт):
Автор решения: Павел
→ Ссылка
Ваш код очень избыточный, для решения этой задачи достаточно хранить соответствия чисел в словаре, а затем, пока это возможно, представлять число в виде римских цифр, начиная с максимальной величины.
roman_numbers = {'M': 1000, 'CM': 900, 'D': 500, 'CD': 400,
'C': 100, 'XC': 90, 'L': 50, 'XL': 40,
'X': 10, 'IX': 9, 'V': 5, 'IV': 4, 'I': 1}
def to_roman(number):
roman = ''
for letter, value in roman_numbers.items():
while number >= value:
roman += letter
number -= value
return roman
print("1777 =", to_roman(1777))
Вывод:
1777 = MDCCLXXVII
Автор решения: Stanislav Volodarskiy
→ Ссылка
Простое решение, которое перечисляет все значения для всех разрядов:
n = int(input())
print(''.join((
('', 'M', 'MM', 'MMM' )[n // 1000 % 10],
('', 'C', 'CC', 'CCC', 'CD', 'D', 'DC', 'DCC', 'DCCC', 'CM')[n // 100 % 10],
('', 'X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC')[n // 10 % 10],
('', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX')[n % 10]
)))
Можно заметить что все строки следуют одному образцу. Тогда так:
def digits(one, five, ten):
return (
'', # 0
one, # 1
one * 2, # 2
one * 3, # 3
one + five, # 4
five, # 5
five + one, # 6
five + one * 2, # 7
five + one * 3, # 8
one + ten # 9
)
n = int(input())
print(''.join((
digits('M', '?', '?')[n // 1000 % 10],
digits('C', 'D', 'M')[n // 100 % 10],
digits('X', 'L', 'C')[n // 10 % 10],
digits('I', 'V', 'X')[n % 10]
)))