将数字转换为罗马符号



我想将数字转换为罗马符号。我收到了一份清单,看起来像这样:

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;

我知道这个代码是错误的,但也许不是这个想法。首先,我想循环遍历字符串编号中的每个"char"(字符)。为此,我还将定义一个变量"I",并将其设置为0。这个变量"i"将在while循环中使用,只要i小于列表conv的长度,就应该执行while循环。然后我想比较整数char是否等于索引[I][0]处conv的整数部分(0是因为我总是想与列表中的数字部分进行比较,I是因为我想循环遍历所有可能的部分。如果它们匹配,那么我想做一些事情,我真的不知道这一步我想做什么,但我想打印出一些东西。在这一步,我想告诉程序构造罗马符号,同时增加I。否则只增加I。)。我必须让程序理解12表示为XII等等。有什么想法可以解决这个问题吗。感谢:)

以下是我的操作方法。此程序循环使用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)

这是一个超级简单的程序,可以根据需要进行转换:

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

最新更新