【问题标题】:Convert from numbers to roman notation [duplicate]从数字转换为罗马符号[重复]
【发布时间】:2015-11-02 20:24:17
【问题描述】:

我想将数字转换为罗马符号。我得到了一个如下所示的列表:

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 是否等于索引 [i][0] 处的 conv 的整数部分(0 因为我总是想与列表中的数字部分进行比较,而 i 因为我想遍历每一种可能性. 如果它们匹配,那么我想做一些事情,我真的不知道我在这一步要做什么,但我想打印出一些东西。在这一步我想告诉程序构造罗马符号, 并且增加 i. 否则只是增加 i. 我必须让程序明白 12 表示为 XII 等等. 任何想法我如何解决这个问题. 谢谢:)

【问题讨论】:

    标签: python loops while-loop converter roman-numerals


    【解决方案1】:

    这就是我的做法。该程序循环遍历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)
    

    【讨论】:

    • 我不明白如何将作为字符串的 roman_digit 乘以数字 roman_digit*(number/denom)
    • 在 Python 中,可以将字符串乘以一个数字。结果是字符串的重复。尝试print("hello" * 5) 并观察结果。 @HenryLynx
    【解决方案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'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-05
      • 1970-01-01
      • 2019-01-09
      • 2011-10-25
      • 1970-01-01
      相关资源
      最近更新 更多