CCF CSP2019-03-2 二十四点 python
本题思路
这个题最开始我看到的时候,想直接暴力判断的,毕竟就三个操作符,也就那么几种情况,可是想想要是字符串长度多了怎么办呢?于是就动了点脑子,下面是我的思路:
运算符有乘除法也有加减法,它们的运算优先级是不一样的,因此当顺序遍历字符串时并不能简单的顺序运算,那我们想想什么时候一定可以确定来运算呢?举个例子,假如你现在已经遍历到的字符串是“3+4+4”那么这种情况是不是就可以运算前面的那个“3+4”了,虽然后面的情况还不确定,但是算前面的一定是没错的,再假如现在遍历到的字符串是“3+4x4”或者“3x4+4”那么一定是可以先算乘除法的,还有一种情况全是乘除操作的就不用说了。
由此我们可以看到当遍历到三个数字的时候是一定可以来运算更新的。我用了两个列表来分别顺序存储数字和运算符。当统计到三个数字时就更新一波列表。最后运算结束时,将列表里可能剩余的两个数字进行计算,得到的结果就是最终的结果了。
拓展
对于有括号的情况,我的代码可能比较麻烦,我在这里就是给大家提供一个思路,我比较推荐的解法还是用数据结构的知识:将中缀表达式转换为前缀或后缀表达式求值(我学习一下下篇就更这个)
下面是我的代码:
n=int(input())
z=[]
t1=['+','-']
t2=['x','/']
def cal(s1,s2):
"""
:param s1: 数字列表
:param s2: 符号列表
:return: 更新后的数字和符号列表
"""
s3=[]
s4=[]
if s2[0] in t1 and s2[1] in t1:
if s2[0] == '+':
s3.append(s1[0] + s1[1])
s3.append(s1[2])
s4.append(s2[1])
else:
s3.append(s1[0] - s1[1])
s3.append(s1[2])
s4.append(s2[1])
elif s2[0] in t2 and s2[1] in t2:
if s2[0]=='x' and s2[1]=='x':
s3.append(s1[0]*s1[1]*s1[2])
elif s2[0]=='/' and s2[1]=='/':
s3.append(s1[0]//s1[1]//s1[2])
elif s2[0]=='x' and s2[1]=='/':
s3.append(s1[0]*s1[1]//s1[2])
else:
s3.append(s1[0]//s1[1]*s1[2])
elif s2[0] in t1 and s2[1] in t2:
if s2[1]=='x':
s3.append(s1[0])
s3.append(s1[1]*s1[2])
s4.append(s2[0])
else:
s3.append(s1[0])
s3.append(s1[1] // s1[2])
s4.append(s2[0])
else:
if s2[0]=='x':
s3.append(s1[0] * s1[1])
s3.append(s1[2])
s4.append(s2[1])
else:
s3.append(s1[0] // s1[1])
s3.append(s1[2])
s4.append(s2[1])
return s3,s4
for i in range(n):
l=input()
snum=[]
sf=[]
for j in l:
if j.isdigit():
snum.append(int(j))
else:
sf.append(j)
if len(snum)==3:
snum,sf=cal(snum,sf)
if len(snum)==2:
if sf[0]=='+':
result=snum[0] + snum[1]
elif sf[0]=='-':
result=snum[0] - snum[1]
elif sf[0]=='x':
result=snum[0] * snum[1]
else:
result=snum[0] // snum[1]
else:
result=snum[0]
if result==24:
z.append("Yes")
else:
z.append("No")
for h in z:
print(h)