You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python整数转罗马数字代码输入超出范围无法循环重新请求问题

罗马数字转换工具输入校验修复方案

问题根因

你的代码仅对「输入是否为合法整数」做了循环校验,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
    # 新增数值范围校验,不满足就继续循环
    if message < 1 or message > 3999:
        print("Invalid number. Try again!")
        continue
    # 所有校验通过才跳出输入循环
    break

print ('Integer to Roman: ',int_to_roman(message))

修改点说明

  • 将数值范围校验逻辑整合进输入的while True循环内部,只有输入同时满足「为合法整数」、「数值在1-3999区间内」两个要求,才会终止输入流程
  • 移除了循环外冗余的范围判断分支,拿到合法数值后直接执行转换输出

内容的提问来源于stack exchange,提问作者code_program

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 08:48:01