|
发表于 2017-7-19 20:29:18
|
显示全部楼层
看起来罗马数字的表示只有1和5,后面数量级变化也只是字母变化
也就是说我只要能表示出 0~9,把加和减分清楚就行了
正好前面练习学到了批量替换,str.maketrans -> translate
- # 划线那条规则明显是针对大数的,那我们这里默认输入 < 4000
- roman = {'I':1,'II':2, 'III':3, 'IV':4, 'V':5, 'VI':6, 'VII':7, 'VIII':8, 'IX':9, 'X':10, 'L':50, 'C':100, 'D':500, 'M':1000, 50: 'L', 100: 'C', 5: 'V', \
- 1000: 'M', 500: 'D', 10: 'X',1: 'I', 2: 'II', 3: 'III', 4: 'IV', 5: 'V', 6: 'VI', 7: 'VII', 8: 'VIII', 9: 'IX',0: ''}
- p = [('I','V','X'),('X','L','C'),('C','D','M'),('M','m','p')]
- # 每一位数单独表示(0-9十种可能),然后按权重替换符号,9的情况特殊,已经用到进位的符号了
- def exchange(s):
- """exchange(str) ->str, 阿拉伯数字与罗马数字转换显示"""
- result = ''
- # 阿拉伯转罗马数字
- if s.isdigit():
- for i,j in zip(range(len(s)-1,-1,-1),p):
- table = str.maketrans("IVX",j[0]+j[1]+j[2]) # 批量替换
- result = roman[int(s[i])].translate(table) +result
-
- # 罗马数字转阿拉伯数字
- elif set(s).issubset({'I','V','X','L','C','D','M'}):
- result = 0
- q = [roman[i] for i in s]
- for k in range(len(q)):
- if q[k]>= max(q[k:]): # 大权重数左边的小权重数是负数
- result += q[k]
- else:
- result -= q[k]
- # 不属于前面两种
- else:
- print("not pure Roman numerals or Arabic numerals")
- return str(result)
复制代码 |
|