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

带用户输入的罗马数字转整数Python代码问题求助

罗马数字转整数程序的问题修正与改进指导

问题核心修正

你当前的问题是把结果打印语句放在了循环内部,每处理一个字符就输出一次中间值。只需要把print("The integer value is: ", int_value)移到整个for循环外面,就能只输出最终结果。

另外,现有代码的错误处理存在漏洞:如果输入包含无效字符,会在循环中多次打印错误提示(比如输入XIZ,处理Z时打印一次错误,其他合法字符仍会继续处理)。建议先统一验证输入的合法性,再执行转换逻辑。

修正后的完整代码:

roman_numerals = {"I": 1,
                  "V": 5,
                  "X": 10,
                  "L": 50,
                  "C": 100,
                  "D": 500,
                  "M": 1000
                  }

int_value = 0
user_input = input("Enter Roman Number: ").upper()

# 先统一验证输入合法性
valid_input = True
for char in user_input:
    if char not in roman_numerals:
        valid_input = False
        break

if valid_input:
    for i in range(len(user_input)):
        current_val = roman_numerals[user_input[i]]
        # 检查下一个字符是否存在且当前值小于下一个值
        if i + 1 < len(user_input) and current_val < roman_numerals[user_input[i+1]]:
            int_value -= current_val
        else:
            int_value += current_val
    print("The integer value is:", int_value)
else:
    print("Invalid input.")

编程改进指导

作为Python新手,可以从以下几个方向优化代码:

  • 封装成函数:把转换逻辑提取成独立函数,方便重复调用和测试
    def roman_to_int(roman_str):
        roman_numerals = {"I":1, "V":5, "X":10, "L":50, "C":100, "D":500, "M":1000}
        roman_str = roman_str.upper()
        # 快速验证输入合法性
        if any(char not in roman_numerals for char in roman_str):
            return None
        
        int_val = 0
        for i in range(len(roman_str)):
            current = roman_numerals[roman_str[i]]
            if i+1 < len(roman_str) and current < roman_numerals[roman_str[i+1]]:
                int_val -= current
            else:
                int_val += current
        return int_val
    
    # 主程序逻辑
    user_input = input("Enter Roman Number: ")
    result = roman_to_int(user_input)
    if result is not None:
        print("The integer value is:", result)
    else:
        print("Invalid input.")
    
  • 更简洁的循环写法:用zip同时遍历当前字符和下一个字符,减少索引操作
    def roman_to_int(roman_str):
        roman_numerals = {"I":1, "V":5, "X":10, "L":50, "C":100, "D":500, "M":1000}
        roman_str = roman_str.upper()
        if any(char not in roman_numerals for char in roman_str):
            return None
        
        int_val = 0
        # 把字符串与自身切片配对,最后一个字符和空字符配对(避免索引越界)
        for current_char, next_char in zip(roman_str, roman_str[1:] + ' '):
            current_val = roman_numerals[current_char]
            next_val = roman_numerals.get(next_char, 0)
            int_val -= current_val if current_val < next_val else -current_val
        return int_val
    
  • 处理边界情况:比如输入空字符串、非标准但常见的罗马数字(如IIII)
  • 添加注释:给关键逻辑加简短注释,方便后续自己或他人理解代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 06:40:20