主要思路就是学会使用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