罗马数字转换
类型:字典
描述
罗马数字包含以下七种字符(字母大写):
I,V,X,L,C,D,M
对应关系如下:
I=1, V=5 ,X=10, L=50, C=100, D=500, M=1000
比如3表示为III,也就是1+1+1=3
XII表示 10+1+1 = 12
MD表示1000+500 =1500
一般来说,大的数字出现在小的数字的左边,但也存在下列情况:
IV=4,IX=9,XL=40, XC=90, CD=400, CM=900
输入一个罗马数字数串,计算对应的10进制整数数值并输出。本题用例均为合法罗马数字表示(不含其他字符)
示例 1
输入:
XI
输出:
11
示例 2
输入:
XIV
输出:
14
参考答案
采用字典保存对应关系,将特殊情况的值减少一个数据间隔再存入,比如,IV存的是3而不是4,目的是为了在顺序读取字符串的时候能直接累加
进入循环优先判断当前字符与前一字符是否在字典中,比如XIV,读取x,累加10,读取I,累加1,读取到V的时候,由于IV在字典中对应为3,所以累加3,由此得到10+1+3=14
def RInt(s):
d={'I':1,'V':5,'X':10,'L':50,'C':100,'D':500,
'M':1000,'IV':3,'IX':8,'XL':30,'XC':80,'CD':300,'CM':800}
t=0
for i in range(len(s)):
if s[i-1:i+1] in d:
t+=(d[s[i-1:i+1]])
else:
t+=(d[s[i]])
return t
s=input()
print(RInt(s))
两行代码实现
def RInt(s):
d = {'I':1, 'IV':3, 'V':5, 'IX':8, 'X':10, 'XL':30, 'L':50, 'XC':80, 'C':100, 'CD':300, 'D':500, 'CM':800, 'M':1000}
return sum(d.get(s[max(i-1, 0):i+1], d[n]) for i, n in enumerate(s))