主要思路就是学会使用itertools解决数字全排序,用eval函数来直接计算,剩下就是暴力组合,直到有一个24为止。
这个地方有个坑,那就是我理解成加减乘除只能使用一次,结果题目其实一个符号可以使用多次,数字只能使用一次,题目没说。
注释不要看,我测试用的,还有一些思路是错的但是注释没删。
import itertools as it#用于计算随机值
dic={'2':'2','3':'3','4':'4','5':'5','6':'6','7':'7','8':'8','9':'9','10':'10','J':'11','Q':'12','K':'13','A':'1'}
#diczh={v:k for k,v in dic.items()}#值和键对换
#print(diczh)#测试用
#写一个函数将数字再转换成字符
def stoz(s):
#z=''#输出转换后的字符
s=str(s).replace("(", "")
s=str(s).replace(")", "")
s=str(s).replace("//", "/")#将整除符改成单斜杠
s=str(s).replace("13", "K")
s=str(s).replace("12", "Q")
s=str(s).replace("11", "J")
s=str(s).replace("1", "A")
return s
while True:
try:
ftmp=list(map(str,input().split(" ")))
if "joker" in ftmp or "JOKER" in ftmp:
print("ERROR")
exit()
stmp=[str(dic.get(i)) for i in ftmp]#转换成字符串
#print(type(stmp[0]))#测试用
#a=eval("((13-1)*4)//2")#测试eval函数
#print(type(a),a)#测试eval函数
sjtmp=list(it.permutations(stmp))#数字全排序
#fhtmp=list(it.permutations(["+","-","*","//"],3))#符号全排序,只要3个
fh=["+","-","*","//"]
#print(fhtmp)#测试用
flag=False#如果为false就不存在24点的情况
for i in sjtmp:#数字全排序
a,b,c,d=i[0],i[1],i[2],i[3]
#这个地方有个坑,那就是我理解成加减乘除只能使用一次,结果题目其实一个符号可以使用多次,数字只能使用一次,题目没说
for j in fh:
for k in fh:
for l in fh:
s="("+"("+a+j+b+")"+k+c+")"+l+d#方便eval函数使用,需要转换成字符串,示例:((13-1)*4)//2
if eval(s)==24:#如果算出值为24
print(stoz(s))#把这个内容最终再转换下
#return s#将正确的值赋值
flag=True#进行赋值,确认存在
exit()#直接退出程序,减少时间复杂度,不能用break,不然只是退出一个循环
if flag==False:
print("NONE")
except:
break