罗马数字不是位置计数法,这从他的计算方法可以看出
1、相同的数字连写,所表示的数等于这些数字相加得到的数,如:Ⅲ = 3;
2、小的数字在大的数字的右边,所表示的数等于这些数字相加得到的数, 如:Ⅷ = 8;Ⅻ = 12;
3、小的数字,(限于Ⅰ、X 和C)在大的数字的左边,所表示的数等于大数减小数得到的数,如:Ⅳ= 4;Ⅸ= 9;
4、正常使用时,连写的数字重复不得超过三次。(表盘上的四点钟“IIII”例外)
5、在一个数的上面画一条横线,表示这个数扩大1000倍。
缺点:过于复杂 不易传播
class Solution:
def romanToInt(self, s: str) -> int:
# b = 0
# for i in s :
# if i == 'I':
# b += 1
# elif i == 'V':
# b += 5
# elif i == 'X':
# b += 10
# elif i == 'L':
# b += 50
# elif i == 'C':
# b += 100
# elif i == 'D':
# b += 500
# elif i == 'M':
# b += 1000
# return b
a = {'I':1, 'V':5, 'X':10, 'L':50, 'C':100, 'D':500, 'M':1000}
b = 0
for i in range(len(s)-1): #这里遍历字符串的时候选择了遍历每个字符的下标,为了防止下标超出就遍历到len(s)-1
if a[s[i]] >= a[s[i+1]]: #如果前大于后则正常相加
b += a[s[i]]
else:
b -= a[s[i]] #如果前大于后就减去当前值
b += a[s[len(s)-1]]
return b
if name == 'main':
s = Solution()
print(s.romanToInt('输入罗马数字'))
将20211412分成两段 2021 1412
分别求得罗马数字为
MMXXI MCDXII