
[英]Writing a function to convert a given integer into a roman numeral using Python programming
[英]Python - Convert a roman numeral to an integer
我尝试了以下Python 3代码,这些代码从罗马转换为 Integer。
代码一目了然。 但是当我输入X
, V
或与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
或与X
和V
值相关时,output 显示Try again
请帮助我了解我哪里出错了。
那是因为您正在比较字符串而不是首先将罗马转换为 int 而不是检查
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: "))
# converting to integer than comparing the value of "MMMCMXCIX"
if ob1.romanToInt(message) <= 8999:
print (ob1.romanToInt(message))
else:
print ("Try again")
最后它只是一个数字的加法,你只需要弄清楚它们是否需要被解释为正数或负数:
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]
Output:
True
True
True
True
如评论中所述,问题是由于您比较字符串而不是先转换为 int 然后进行比较而引起的。
您可以尝试的其他方法是:
def romanToInt(s):
d = {'m': 1000, 'd': 500, 'c': 100, 'l': 50, 'x': 10, 'v': 5, 'i': 1}
n = [d[i] for i in s.lower() if i in d]
return sum([i if i>=n[min(j+1, len(n)-1)] else -i for j,i in enumerate(n)])
print(romanToInt('X')) # 10
print(romanToInt('V')) # 5
print(romanToInt('IV')) # 4
print(romanToInt('XV')) # 15
在我看来,两者都更像pythonic。
下面列出了一些方法及其各自的运行时将罗马数字转换为整数。
解决方案 1:(大约运行时间 = 52 毫秒)
def romanToInt(self, s: str) -> int:
s = s.upper()
roman = {'I':1, 'V':5, 'X':10, 'L':50, 'C':100, 'D':500, 'M':1000 }
num = 0
for i in range(len(s)):
if i!= len(s)-1 and roman[s[i]] < roman[s[i+1]]:
num += roman[s[i]]*-1
else:
num += roman[s[i]]
return num
解决方案 2:(大约运行时间 = 60 毫秒)
def romanToInt(self, s: str) -> int:
s = s.upper()
roman = {'I':1, 'V':5, 'X':10, 'L':50, 'C':100, 'D':500, 'M':1000 }
num = 0
s = s.replace("IV", "IIII").replace("IX", "VIIII")
s = s.replace("XL", "XXXX").replace("XC", "LXXXX")
s = s.replace("CD", "CCCC").replace("CM", "DCCCC")
for x in s:
num += roman[x]
return num
解决方案 3:(大约运行时间 = 48 毫秒)
def romanToInt(self, s: str) -> int:
s = s.upper()
roman = {'I':1, 'V':5, 'X':10, 'L':50, 'C':100, 'D':500, 'M':1000 }
num = 0
for i in range(len(s)-1):
if roman[s[i]] < roman[s[i+1]]:
num += roman[s[i]]*-1
continue
num += roman[s[i]]
num +=roman[s[-1]]
return num
最简单的解决方案有时似乎是最好的:)
您可以通过以下简单方式解决此问题。
这个问题可以通过这样的想法来解决
在下面,上述特殊情况由if
语句处理。
def romanToInt(s):
mapping = {
'I': 1,
'V': 5,
'X': 10,
'L': 50,
'C': 100,
'D': 500,
'M': 1000,
}
min_ = None
total = 0
for c in s:
val = mapping[c]
print(val)
if min_ and val > min_:
total -= min_*2
else:
min_ = val
total += val
return total
def romanToInt(s):
p=z=0
for i in map('IVXLCDM'.find,s[::-1]):x=[1,5][i%2]*10**(i//2);z+=[x,-x][p>x];p=x
return z
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.