带用户输入的罗马数字转整数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
相关产品推荐
相关产品推荐

