Найти - Пользователи
Полная версия: Перевод арабских цифр в римские и обратно
Начало » Центр помощи » Перевод арабских цифр в римские и обратно
1
ramses
Такие дела. С задачей перевода из арабских в римские без проблем разобрался:
# Название программы: AraRom #
# Создатель программы: ramses #
# E-mail создателя: moredarker@yandex.ru #
# ICQ создателя: 622221805 #
# Дата создания: 19 апреля 2011, день #
# Дата последнего изменения: 19 апреля 2011, день #
# ************* #
# Суть программы: Программа переводит арабские числа в римские. #
# Заметки: алгоритм перевода пугает количеством буков и ветвлений. #
# №0 ************* #
def arabic_roman(nums):
def addition(num,length):
def filling(length):
zero = ['','']
i = 1
while i+1 < length:
zero.append(zero[len(zero)-1] + '0')
i += 1
return zero
return num[:2] + filling(length)[length-1-len(num[2:])] + num[2:]
nums = addition('0d'+str(nums), 6)[2:]
results = ''
liters = {1:'I', 4:'IV', 5:'V', 9:'IX', 10:'X', 40:'XL', 50:'L', 90:'XC', 100:'C',
400:'CD', 500:'D', 900:'CM', 1000:'M'}
results += liters[1000] * int(nums[0])
if int(nums[1]) == 0:
results += ''
elif 1 <= int(nums[1]) <= 3:
results += liters[100] * int(nums[1])
elif int(nums[1]) == 4:
results += liters[400]
elif int(nums[1]) == 5:
results += liters[500]
elif 6 <= int(nums[1]) <= 8:
results += liters[500] + liters[100] * (int(nums[1])-5)
else:
results += liters[900]
if int(nums[2]) == 0:
results += ''
elif 1 <= int(nums[2]) <= 3:
results += liters[10] * int(nums[2])
elif int(nums[2]) == 4:
results += liters[40]
elif int(nums[2]) == 5:
results += liters[50]
elif 6 <= int(nums[2]) <= 8:
results += liters[50] + liters[10] * (int(nums[2])-5)
else:
results += liters[90]
if int(nums[3]) == 0:
results += ''
elif 1 <= int(nums[3]) <= 3:
results += liters[1] * int(nums[3])
elif int(nums[3]) == 4:
results += liters[4]
elif int(nums[3]) == 5:
results += liters[5]
elif 6 <= int(nums[3]) <= 8:
results += liters[5] + liters[1] * (int(nums[3])-5)
else:
results += liters[9]
return results
# №1 ************* #
while True:
try:
num = int(input('Введите арабское число в диапазоне от 1 до 3999:'))
if 1 <= num <= 3999:
break
else:
print('Число должно быть в диапазоне от 1 до 3999.')
continue
except ValueError:
print('Необходимо задать целое число, а не нечто другое.. Просьба повторить ввод.')
continue
# №2 ************* #
print(arabic_roman(num))
# №3 ************* #
В принципе, работает, но, если честно, выглядит говнокодом (не эстетично).. Какие у кого мысли будут насчёт этого?
З.Ы. Прощу за прощение за мутную функцию addition - я её просто из другой моей программки выдернул..
А вот с переводом из римских - беда… Никаких мыслей даже нету. Мб подскажите чего?
zheromo
http://diveintopython.org/unit_testing/stage_5.html
agalen
Вот конвертация в обе стороны.

CONV_TABLE = ((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'))

def arab_to_roman( number ):
if number <= 0: return ''

ret = ''
for arab, roman in CONV_TABLE:
while number >= arab:
ret += roman
number -= arab

return ret

def roman_to_arab( txt ):
txt = txt.upper()
ret = 0
for arab, roman in CONV_TABLE:
while txt.startswith( roman ):
ret += arab
txt = txt[ len( roman ): ]
return ret


for i in ( 0, 4, 8, 9, 31, 46, 99, 583, 888, 1668, 1989, 2009, 2010, 2011, 3999 ):
arab = arab_to_roman( i )
roman = roman_to_arab( arab )
print i, arab, roman
ramses
Сцук, а я так мучился..
def roman_arabic(string):
liters = {1:'I', 4:'IV', 5:'V', 9:'IX', 10:'X', 40:'XL', 50:'L', 90:'XC', 100:'C',
400:'CD', 500:'D', 900:'CM', 1000:'M'}
liter = ['I','V','X','L','C','D','M']
arr = []
result = int()
for i in liter:
arr += [string.count(i)]
entries = dict(zip(liter, arr))
if entries['M']:
if entries['M'] > 1:
entries['M'] *= 1000
else:
if string[string.index('M')] == 1:
entries['M'] = 900
if entries['D']:
if string[string.index('D')-1] == 'C':
entries['D'] = 400
else:
entries['D'] = 500
if entries['C']:
if entries['M'] == 900 or entries['D'] == 400:
entries['C'] = 0
else:
if string[string.rindex('C')-1] == 'X':
entries['C'] -= 1
entries['L'] = 90
entries['C'] *= 100
if entries['L'] != 90:
if entries['L'] and string[string.index('L')-1] == 'X':
entries['L'] = 40
else:
entries['L'] = 50
if entries['L'] == 90 or entries['L'] == 40:
if string[string.rindex('X')-1] == 'I':
entries['V'] = 9
entries['I'] = 0
entries['X'] = 0
else:
entries['X'] *= 10
if entries['V'] and entries['V'] != 9:
if string[string.rindex('V')-1] == 'I':
entries['V'] = 4
entries['I'] = 0
else:
entries['V'] = 5
if entries['X'] and string[string.rindex('X')-1] == 'I':
entries['I'] = 9
else:
entries['I'] *= 1
return entries
result = int()
for i in roman_arabic('XI').values():
result += i
print(i)
print('')
print(result)
Спасибо:)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB