不使用def函数实现罗马数字转整数的新手编程问题求助
罗马数字转整数实现方案
核心计算规则
- 罗马数字常规书写逻辑是数值大的符号在前,数值小的在后,该场景下直接累加每个符号对应的值即可
- 遇到小数在前大数在后的特殊场景(比如IV=4、IX=9、XL=40等),用后位的大数减去前位的小数计算即可,或者直接优先匹配2字符的特殊组合计算
现有代码问题修正
你当前的代码存在几个可调整的点:
- 输出变量名拼写错误,你写的是
ouput,正确拼写应为output - 不要在for循环内部修改迭代变量
i,for循环的i每次迭代都会自动被range生成的值覆盖,手动修改会导致逻辑混乱 - 你已经把2字符的特殊罗马数字存入字典,可优先判断当前位置+后续1位的组合是否在字典内,存在就直接加对应值同时跳过下一个字符,不存在就加当前单个字符的值
可直接运行的实现代码
版本1:按数值大小判断逻辑(无需存2字符特殊组合)
DictOfRomanNumerals = {"I":1, "V":5, "X":10, "L":50, "C":100, "D":500, "M":1000} UserInput = input("Type in a Roman Numeral: ").strip().upper() output = 0 i = 0 length = len(UserInput) while i < length: # 先判断是否存在下一位,且当前字符值小于下一位字符值 if i + 1 < length and DictOfRomanNumerals[UserInput[i]] < DictOfRomanNumerals[UserInput[i+1]]: # 特殊情况:后位减前位 output += DictOfRomanNumerals[UserInput[i+1]] - DictOfRomanNumerals[UserInput[i]] # 步进2位,跳过已计算的后位 i += 2 else: # 正常情况直接累加当前值 output += DictOfRomanNumerals[UserInput[i]] # 步进1位 i += 1 print(output)
版本2:沿用你原有的带2字符组合的字典
DictOfRomanNumerals = {"I":1, "II":2, "III":3, "IV":4, "V":5, "IX":9, "X":10, "XL":40, "L":50, "XC":90, "C":100, "CD":400, "D":500, "CM":900, "M":1000} UserInput = input("Type in a Roman Numeral: ").strip().upper() output = 0 i = 0 length = len(UserInput) while i < length: # 优先匹配2字符的特殊组合 if i + 1 < length and UserInput[i:i+2] in DictOfRomanNumerals: output += DictOfRomanNumerals[UserInput[i:i+2]] i += 2 else: output += DictOfRomanNumerals[UserInput[i]] i += 1 print(output)
代码说明
- 全程未使用
def函数,仅用到基础的循环、判断、字典操作,符合你当前的学习进度 - 用
while循环方便手动控制索引的步进长度,处理2字符组合时直接跳2位,不会出现重复计算问题 - 增加了
strip()和upper()处理逻辑,用户输入小写罗马数字或者前后带空格也不会报错
内容的提问来源于stack exchange,提问作者user17143760
相关产品推荐
相关产品推荐

