Python: 每日一题 57
本帖最后由 ooxx7788 于 2017-6-3 11:58 编辑本题简单的说,就是罗马数字与阿拉伯数字转换。
首先给出罗马数字对应的阿拉伯数字表。
Symbol Value
I 1
V 5
X 10
L 50
C 100
D 500
M 1,000
1、相同的数字连写、所表示的数等于这些数字相加得到的数、如:Ⅲ=3;
2、小的数字在大的数字的右边、所表示的数等于这些数字相加得到的数、 如:Ⅷ=8、Ⅻ=12;
3、小的数字(限于 I、X 和 C)在大的数字的左边、所表示的数等于大数减小数得到的数、如:Ⅳ=4、Ⅸ=9;
4、正常使用时、连写的数字重复不得超过三次;
5、在一个数的上面画一条横线、表示这个数扩大 1000 倍。(本条我们就不考虑了)
有两条须注意掌握:
基本数字 Ⅰ、X 、C 中的任何一个、自身连用构成数目、或者放在大数的右边连用构成数目、都不能超过三个;放在大数的左边只能用一个;
不能把基本数字 V 、L 、D 中的任何一个作为小数放在大数的左边采用相减的方法构成数目;放在大数的右边采用相加的方式构成数目、只能使用一个;
还有更多不理解的,那么就百度吧。
**** Hidden Message ***** 看一下啊 666666666 看起来罗马数字的表示只有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+j+j)# 批量替换
result = roman)].translate(table) +result
# 罗马数字转阿拉伯数字
elif set(s).issubset({'I','V','X','L','C','D','M'}):
result = 0
q = for i in s]
for k in range(len(q)):
if q>= max(q):# 大权重数左边的小权重数是负数
result += q
else:
result -= q
# 不属于前面两种
else:
print("not pure Roman numerals or Arabic numerals")
return str(result) 答案不是只提供了阿拉伯转罗马数字吗?题目的意思只要求这个?我还写多了{:10_258:}
答案的递归很溜啊,vals取的值正好把麻烦的9和4解决了,很巧
看答案
重要是不会,没有想通那些逻辑判断语句 学习一下 symbol = {"I":1, "V":5, "X":10, "L":50, "C":100, "D":500, "M":1000}
def fun57(str1):
sum1 = symbol]
for each in range(len(str1) - 1):
if len(str1) >= 4:
if str1 == str1 == str1:
return -1
if symbol] == symbol] or symbol] > symbol]:
sum1 += symbol]
elif symbol] < symbol]:
sum1 += symbol] - 2 * symbol]
return sum1
print(fun57("III"))
print(fun57("VII"))
print(fun57("IV"))
print(fun57("IIIVVVV")) 看答案 观摩 看看答案 学习
看看答案 1 学习一下 symbol = {'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000}
dic = list(zip(('M', 'CM', 'D', 'CD', 'C', 'XC', 'L', 'XL', 'X', 'IX', 'V', 'IV', 'I'),
(1000, 900, 500,400, 100, 90,50, 40,10, 9, 5, 4, 1)))
def exchange(number):
if isinstance(number, int):
# 阿拉伯数字转罗马数字
if number > 0:
result = ""
for c, v in dic:
while v <= number:
result += c
number -= v
return result
else:
return "您所输入的阿拉伯数字为负数,无法转换!"
elif isinstance(number, str):
# 罗马数字转阿拉伯数字
if len(number) == 1:
return symbol
else:
last_word = "I"
result = 0
for each in list(reversed(number)):
if symbol >= symbol:
result += symbol
else:
result -= symbol
last_word = each
if number == exchange(result):
return result
else:
return "您所输入的罗马数字不准确,无法转换!"
else:
return "您所输入的参数并不是阿拉伯数字或罗马数字!"
# 正确的测试用例
print(exchange(398))
print(exchange("MMX"))
# 错误的测试用例
print(exchange(-5))
print(exchange("MCMDCDCXCX"))
print(exchange([-5, "MCMDCDCXCX"])) {:5_108:} 666 1
页:
[1]