转换罗马数字

时间:2015-10-29 23:44:31

标签: python python-3.x

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

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

2 个答案:

答案 0 :(得分:0)

请小心使用与您在值词典中放置的字母相同的字母,所以除了D之外全部小写。

一个好的解决方案可能是取代那个大写字母" D"用" d"并将ch.lower()传递给translate函数。

答案 1 :(得分:0)

这是一个有一些适当修改的版本。

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

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