2015-11-02 6 views
1

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

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. Затем я хочу сравнить, если целочисленный символ равен целочисленной части conv по индексу [i] [0] (0, потому что я всегда хочу сравнить с числами в списке и i, потому что я хочу перебирать каждую возможность Если они совпадают, то я хочу что-то сделать, я действительно не знаю, что я хочу сделать на этом этапе, но я хотел бы что-то распечатать. На этом этапе я хотел бы сказать программе о создании римской нотации , а также инкрементирование i. Просто добавьте i. Я должен сделать программу понятной, что 12 представлена ​​как XII и т. д. Любые идеи, как я мог бы решить эту проблему. Спасибо :)

ответ

1

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

>>> 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' 
4

Вот как я это сделаю. Эта программа проходит через массив 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) 
+0

Я не понимаю, как ожидается, будет умножаться roman_digit, который представляет собой строку в число roman_digit * (номер/DENOM) –

+2

В Python, можно умножить строку на число. Результатом является повторение строки. Попробуйте 'print (« hello »* 5)' и наблюдайте результат. @HenryLynx –