转换罗马数字

2024-05-15 04:49:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我必须创建一个程序,将罗马数字转换为十进制,但没有使用循环,现在我写了这个,但它给我错误

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)) 

Tags: lambda程序mapinputreturndef错误entrez
2条回答

注意使用与在值字典中输入的字母格式相同的字母,因此除了D之外,所有字母都是小写的

一个好的解决方案是用一个“D”代替大写的“D”,然后通过ch.下()转换函数。在

这是一个经过适当修改的版本。在

  • 对输入调用.lower()。在
  • 做一些基本的错误处理,只允许你的dict中的数字作为输入。在
  • 添加了正确计算数字的行为,如将IX改为9而不是11。在

我在Python3.4上测试了这个代码,同样的代码也在Python2.7上运行(使用原始输入而不是输入)。希望有帮助。在

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))

相关问题 更多 >

    热门问题