我正在学习编码,并且我有一个练习来制作一个罗马数字到整数的转换器。我知道有很多不同的方法可以编写这个程序,但如果你能帮我找出我的错误,我将不胜感激。我很想听听有关如何更好地编写它的建议,但我现在真正可以使用的是了解我在这方面做错了什么。
我有一本名为 roman_numerals 的字典。它的键是罗马数字值,它的值是它们匹配的整数。
roman_numerals = {"M":1000,"CM":900,"D":500,"CD":400,"C":100,"XC":90,"L":50,"XL":40,"X":10,"V":5,"IV":4,"I":1}
def roman_int(user_choice):
if user_choice == "1":
user_roman = input("What numeral would you like to convert?\n").upper()
resultI = 0
for k,v in roman_numerals.items():
if user_roman == k:
resultI += roman_numerals.get(user_roman)
else:
for i in user_roman:
if i in roman_numerals.keys():
if i == k:
resultI += v
print(resultI)
当我运行我的代码时,如果我使用一个等于多个字符的 key 的数字(例如“IV”),我得到的结果是两个“IV”和“V”。或“CM”和“M”。 我知道为什么会这样,因为我要求迭代。但是,我可以要求我的程序在返回值时停止迭代吗?我觉得我真的很接近解决方案,但此时我只是感到困惑。
谢谢!
请您参考如下方法:
您必须确保消耗了对总和有贡献的所有字符。由于所有多字符“原子”文字都以较低值的单位开头,否则,较高值的单位排在第一位,因此一种简单的贪心方法是可行的:
- 尝试将前两个字符作为一个整体进行转换,如果不可能,则转换第一个单个字符。
向前移动适当的步数。
def roman_int(user_roman): user_roman = user_roman.upper() resultI = 0 while user_roman: # try first two chars if user_roman[:2] in roman_numerals: resultI += roman_numerals[user_roman[:2]] # cut off first two chars user_roman = user_roman[2:] # try first char elif user_roman[:1] in roman_numerals: resultI += roman_numerals[user_roman[:1]] # cut off first char user_roman = user_roman[1:] else: print('No roman number') return print(resultI)
