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就很不错了啦!!!