P1957茫茫c++|Pascal题解中的python题解
本蒟蒻原c++蒟蒻一枚,刷到这道题的时候正好碰上python比赛前夕(!!!),于是迅速写了py代码,AC!!!(python妙啊)翻题解的时候发现都是c++|Pascal神犇,再然后就有了本人第一篇题解,望管理员在众多c++&Pascal题解中插一个弱弱的py……
闲言少叙,接下去切入正题
首先,输入n,循环n次(废话)
接下去,棘手的事来了:由于输入数据有可能为一行两个,也有可能为一行三个,而且第一个有可能是字符,也有可能是数字,所以就不能直接map()了
so如何解决这个问题呢?没办法,只能先用一个list把数据存起来,判断第一个是不是字符(即能不能转换成int),如果是就说明符号要转换,不然就直接转换数据就可以了
eq=input().split()
if isstring(eq[0]):
a,b,c=YUN[eq[0]],int(eq[1]),int(eq[2]) #其中a表示符号,b,c分别是两个数据
else:
b,c=map(int,eq)
else里的a变成了啥?不去动它,它就会保留上一次循环的a,符号问题解决
oh,这里要说一下,YUN是一个dict类型(py独有!c++好像有类似的map映射, 我不太熟悉其他语言哈,有错莫怪),是给我这种懒得打if-elif的人偷懒用的
YUN 的定义就放在下面了:
YUN={'a':'+','b':'-','c':'*'}
至于函数isstring,我选择自己定义一个函数来返回是否能形成int,判断方式就是直接try(异常处理)报错说明不能,返回True(表示这是个字符)。
def isstring(n):
try:
int(n)
except:
return True
else:
return False #应该可以加到try里(没试过),但我喜欢这样else,思路清晰一点
当然,这个函数也可以写成:
def isstring(n):
return n>='a' and n<='c'
但速度稍微慢了一点点,就3ms啦,不要紧的(况且try还可以秀一秀语言功底,何乐而不为?)
完成了这一部分,代码就ok一半了
接下去要考虑如何输出:由于要求输出长度,所以还是用变量存一下吧
那这个字符串怎么形成呢?简单,直接用py强大的eval函数和字符串格式化(应该叫这个),一行代码暴力解决!
s='%s%s%s=%s'%(b,YUN[a],c,eval('%s%s%s'%(b,YUN[a],c)))
py真香!!!
然后就完事具备,只欠东风了!print一下…… AC!!! 妈呀代码比c++|Pascal短多了!(吹嘘ing)
def isstring(n):
try:
int(n)
except:
return True
else:
return False
YUN={'a':'+','b':'-','c':'*'}
n=int(input())
for i in range(n):
eq=input().split()
if isstring(eq[0]):
a,b,c=YUN[eq[0]],int(eq[1]),int(eq[2])
else:
b,c=map(int,eq)
s='%s%s%s=%s'%(b,a,c,eval('%s%s%s'%(b,a,c)))
print(s,len(s),sep='\n')
不要问我为啥要200ms左右,不要艳羡c++大佬的20ms,也不看看py运算速度到底多慢,和人家c++是一个量级的么?!不要1s以外TLE就很不错了啦!!!