我必须创建一个程序,将罗马数字转换为十进制但不使用循环现在我写了这个,但它给了我错误
def translate(mdg):
values = {"i":1, "v":5, "x":10, "D":500, "c":100, "m":1000}
return sum(map(lambda x: values[x], mdg))
ch = input("Entrez un nombre romain en utilisant les lettres M, D, C, X, I:")
print(translate(ch))
答案 0 :(得分:0)
请小心使用与您在值词典中放置的字母相同的字母,所以除了D之外全部小写。
一个好的解决方案可能是取代那个大写字母" D"用" d"并将ch.lower()传递给translate函数。
答案 1 :(得分:0)
这是一个有一些适当修改的版本。
我在python 3.4上对此进行了测试,同样的代码也在python 2.7上运行(使用raw_input而不是input)。希望有所帮助。
values = {"i":1, "v":5, "x":10, "d":500, "c":100, "m":1000}
mdg = input("Entrez un nombre romain en utilisant les lettres M, D, C, X, I:")
mdg = mdg.lower()
# small error check. make sure each mdg character is in values dict
while True:
try:
## check for prefix numbers and double remove them
## (they were added instead of subtracted)
## total(im) = 999, but naiveAdd(im) = 1001
smallerPrior = [values[mdg[x]]<values[mdg[x+1]] for x in \
range(len(mdg)-1)]
break
except KeyError:
mdg = input("use only M, D, C, X, I:")
mdg.lower()
pass
firstSum = sum(map(lambda x: values[x], mdg))
overCounted = sum(map(lambda n: -2*values[mdg[n]] if smallerPrior[n] \
else 0, range(len(smallerPrior))))
print("In Arabic numerals that is: " +str(firstSum+overCounted))