Преобразование чисел в римскую запись

Я хочу преобразовать числа в римские обозначения. Мне дали список, который выглядит следующим образом:

conv = [[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']]

где ввод должен быть целым числом от 0 до 3999. Итак, я хочу создать функцию, которая принимает аргумент (целое число) и преобразует его. У меня есть небольшая проблема решить это. Любая помощь будет оценена по достоинству. Вот как я думаю:

Сначала мне нужен ввод целого числа, которое я сохраняю в переменной, поэтому я буду использовать что-то вроде

number = input("Enter a number between 0 and 3999: ")

conv = [[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']]

На последнем шаге я хочу использовать 2 цикла для решения реальной проблемы. Что выглядит примерно так:

for char in number:
    i = 0;
    while i < len(conv):
        if int(char) == int(conv[i][0]):
            print(conv[i][1])
            i += 1;
        else:
            i += 1;

Я знаю, что этот код неверен, но, возможно, это не так. Сначала я хочу перебрать каждый «символ» (символ) в номере строки. Для этой цели я также определю переменную «i», которой я присвоил значение 0. Эта переменная «i» будет использоваться в цикле while, который должен выполняться до тех пор, пока i меньше длины списка conv. Затем я хочу сравнить, равен ли целочисленный char целочисленной части conv по индексу [i][0] (0, потому что я всегда хочу сравнивать с числовыми частями в списке, и я, потому что я хочу перебрать все возможные , Если они совпадают, то я хочу что-то сделать, я действительно не знаю, что я хочу сделать на этом шаге, но я хотел бы что-то распечатать На этом шаге я хотел бы сказать программе построить римскую запись , а также увеличить i. Иначе просто увеличить i. Я должен заставить программу понять, что 12 представлено как XII и т. д. Любые идеи, как я мог бы решить эту проблему. Спасибо :)


person jopp    schedule 02.11.2015    source источник


Ответы (2)


это очень простая программа, которая преобразует его так, как вы хотите:

>>> num = 1423
>>> roman = ''
>>> i = 0 #initiate i = 0
>>> while num > 0:
    while conv[i][0] > num: i+=1 #increments i to largest value greater than current num
    roman += conv[i][1] #adds the roman numeral equivalent to string
    num -= conv[i][0] #decrements your num


>>> roman
'MCDXXIII'
person R Nar    schedule 02.11.2015

Вот как бы я это сделал. Эта программа перебирает массив conv, на каждом этапе добавляя соответствующие римские цифры к result.

def arabic_to_roman(number):
    conv = [[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']]
    result = ''
    for denom, roman_digit in conv:
        result += roman_digit*(number/denom)
        number %= denom
    return result

for i in 1,4,9,16,25,49,81,1963,2015:
    print i, arabic_to_roman(i)
person Robᵩ    schedule 02.11.2015
comment
Я не понимаю, как предполагается умножать roman_digit, который является строкой, на число roman_digit*(number/denom) - person Henry Lynx; 04.05.2017
comment
В Python можно умножить строку на число. Результатом является повторение строки. Попробуйте print("hello" * 5) и посмотрите на результат. @ГенриЛинкс - person Robᵩ; 04.05.2017