【问题标题】:Python - Transform an integer to a romanPython - 将整数转换为罗马
【发布时间】:2021-12-15 15:32:06
【问题描述】:

一目了然,代码运行良好。但是当我输入任何数字 > 3999 时,代码以消息“无效数字。再试一次!”结尾。并且输入不重复,因为它是无效的。输入应该一次又一次地返回,直到输入的数字有效(在 1 到 3999 之间)。

这是我的代码:

def int_to_roman(num):
    val = [
            1000, 900, 500, 400,
            100, 90, 50, 40,
            10, 9, 5, 4,
            1
            ]
    syb = [
            "M", "CM", "D", "CD",
            "C", "XC", "L", "XL",
            "X", "IX", "V", "IV",
            "I"
            ]
    roman_num = ''
    i = 0
    while  num > 0:
        for _ in range(num // val[i]):
            roman_num += syb[i]
            num -= val[i]
        i += 1
    return roman_num
    
def roman_to_int(numeral):
    rom_val = {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000}
    int_val = 0
    for i in range(len(numeral)):
        if i > 0 and rom_val[numeral[i]] > rom_val[numeral[i - 1]]:
            int_val += rom_val[numeral[i]] - 2 * rom_val[numeral[i - 1]]
        else:
            int_val += rom_val[numeral[i]]
    return int_val

while True:
    try:
        message = int(input("Enter your integer number: "))
    except ValueError:
        print("Invalid input. Try again!")
        continue
    else:
        break
if message == 0:
    print ("Invalid integer number. Try Again!")
elif message <= 3999:
    print ('Integer to Roman: ',int_to_roman (message))
else:
    print("Invalid number. Try again!") 

【问题讨论】:

    标签: python python-3.x integer


    【解决方案1】:

    您的 if 条件在 while 循环之外,并且 else 中断不是必需的(如果您想在第二个 if 条件中添加 break,则可以)。

    def int_to_roman(num):
        val = [
                1000, 900, 500, 400,
                100, 90, 50, 40,
                10, 9, 5, 4,
                1
                ]
        syb = [
                "M", "CM", "D", "CD",
                "C", "XC", "L", "XL",
                "X", "IX", "V", "IV",
                "I"
                ]
        roman_num = ''
        i = 0
        while  num > 0:
            for _ in range(num // val[i]):
                roman_num += syb[i]
                num -= val[i]
            i += 1
        return roman_num
        
    def roman_to_int(numeral):
        rom_val = {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000}
        int_val = 0
        for i in range(len(numeral)):
            if i > 0 and rom_val[numeral[i]] > rom_val[numeral[i - 1]]:
                int_val += rom_val[numeral[i]] - 2 * rom_val[numeral[i - 1]]
            else:
                int_val += rom_val[numeral[i]]
        return int_val
    
    while True:
        try:
            message = int(input("Enter your integer number: "))
        except ValueError:
            print("Invalid input. Try again!")
            continue
        if message == 0:
            print ("Invalid integer number. Try Again!")
        elif message <= 3999:
            print ('Integer to Roman: ',int_to_roman (message))
            break
        else: 
            print("Invalid number. Try again!")  
    

    【讨论】:

      【解决方案2】:

      根据您的代码缩进,检查message 值范围似乎是在您的while 循环之外执行。这将不允许再次请求输入。

      为了使这个更清晰,你应该给你的变量(数字)一个更有目的的名字,并且只有当你得到一个有效的值时才跳出循环。然后,您可以将罗马数字转换放在循环之外,并确保数字有效。

      while True:
          try:
              number = int(input("Enter your integer number: "))
              if number > 0 and number < 4000: break # number is valid           
          except ValueError: pass
          print("Invalid number. Try again!")
      print ('Integer to Roman: ',int_to_roman (number))
      

      【讨论】:

        【解决方案3】:
        while True:
            try:
                message = int(input("Enter your integer number: "))
            except ValueError:
                print("Invalid input. Try again!")
                continue
            if message == 0:
                print ("Invalid integer number. Try Again!")
            elif message <= 3999:
                print ('Integer to Roman: ', int_to_roman(message))
            else:
                print("Invalid number. Try again!") 
        

        我认为删除else: break(在这种情况下没有必要)并缩进最后一个 if else 块可以解决这个问题

        【讨论】:

        • 你忘了说你删除了else: break
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-01-09
        • 2011-10-25
        • 2012-10-09
        • 2020-05-11
        • 2014-10-19
        相关资源
        最近更新 更多