首页 > 解决方案 > Python - 将罗马数字转换为整数

问题描述

我尝试了以下从 Roman 转换为 Integer 的Python 3代码。

代码一目了然。但是当我输入时发生了某些问题XV或者与X值有关V

例如:当我尝试V代码不起作用但IV显示正确的值时。

我的代码:

class Solution(object):
   def romanToInt(self, s):
      """
      :type s: str
      :rtype: int
      """
      roman = {'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000,'IV':4,'IX':9,'XL':40,'XC':90,'CD':400,'CM':900}
      i = 0
      num = 0
      while i < len(s):
         if i+1<len(s) and s[i:i+2] in roman:
            num+=roman[s[i:i+2]]
            i+=2
         else:
            #print(i)
            num+=roman[s[i]]
            i+=1
      return num
ob1 = Solution()

message = str(input("Please enter your roman number: "))
if message <= ("MMMCMXCIX"):
   print (ob1.romanToInt(message))
else:
    print ("Try again")

我设置了条件,如果输入的罗马数字等于或小于MMMCMXCIX,它将打印罗马数字;否则它将打印Try again

问题是当我输入X或与输出V相关XV重视输出时Try again

请帮助我了解我哪里出错了。

标签: pythonpython-3.xif-statementroman-numerals

解决方案


最后它只是一个数字的加法,你只需要弄清楚它们是否需要被解释为正数或负数:

roman = {'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,'M':1000,'IV':4,'IX':9,'XL':40,'XC':90,'CD':400,'CM':900}

def roman2Dec(inp):
    inpNum = [roman[x] for x in inp]
    return sum([-x if i < len(inpNum)-1 and x < inpNum[i+1] else x for i, x in enumerate(inpNum)])

for nums in [('IX', 9), ('XL', 40), ('LXI', 61), ('MMMCMXCIX', 3999)]:
    result = roman2Dec(nums[0])
    print result == nums[1]

输出:

True
True
True
True

推荐阅读