import itertools
#主要是6種操作,包括加減乘除四種,還有反向減,反向除
def doMethod(x, m, n):
if x==0:
return m+n
elif x==1 and m>n:
return m-n
elif x==2 and n>m:
return n-m
elif x==3:
return m*n
elif x==4 and n!=0:
return m/n
elif x==5 and m!=0:
return n/m
else:
return -1
#打印,主要是將加減乘除的符號打印出來,還有就是在合適的時候添加括號
def printEquation(listObj, i, j, k):
initStr, l, r = "", "(", ")"
#反向操作時,調換位置
if i==2 or i==5:
initStr = str(listObj[1]) + " " + doList[i] + " " + str(listObj[0])
else:
initStr = str(listObj[0]) + " " + doList[i] + " " + str(listObj[1])
#一、如果前面操作爲加減操作,後面爲乘除或者反向減,則需要添加括號
#二、如果前面操作爲乘除,後面爲反向除,則需要添加括號
if (i < 3 and j >= 2) or (3 <= i <= 5 and j == 5):
initStr = l + initStr + r
#反向操作時,調換位置
if j==2 or j==5:
initStr = str(listObj[2]) + " " + doList[j] + " " + initStr
else:
initStr = initStr + " " + doList[j] + " " + str(listObj[2])
#一、如果前面操作爲加減操作,後面爲乘除或者反向減,則需要添加括號
#二、如果前面操作爲乘除,後面爲反向除,則需要添加括號
if (j < 3 and k >= 2) or (3 <= j <= 5 and k == 5):
initStr = l + initStr + r
#反向操作時,調換位置
if k==2 or k==5:
initStr = str(listObj[3]) + " " + doList[k] + " " + initStr
else:
initStr = initStr + " " + doList[k] + " " + str(listObj[3])
return initStr
#下面是主要的循環代碼,首先前面兩個數字有6種操作,然後將操作的結構和第三個數字又有6種操作,
#然後依次和最後一個數字也有6種操作,四個數字排列組合有24種,然後進行這6*6*6的操作,如果
#最終誤差小於0.01就當是24了,中間有輸入判斷,然後用set集合進行排重,不過對於調換順序的排重
#目前沒有去做那個,希望有人能夠完善吧
listStr = ""
print("############ 鬥24點 ############")
while True:
listStr = input("\n請輸入四個正整數,以空格分隔開來!\n")
if len(listStr) > 0:
listStr = ' '.join(listStr.split())
newList = listStr.split(' ')
numList = []
if len(newList) == 4:
for i in newList:
if i.isdigit() and i!='0':
numList.append(int(i))
if len(numList) == 4:
doList = ["+","-","-","×","÷","÷"]
printSet = set()
#這裏用到了python自帶的排列算法
listArray = list(itertools.permutations(numList,4))
for listObj in listArray:
for i in range(6):
number1 = doMethod(i, listObj[0], listObj[1])
if number1 < 0: continue
for j in range(6):
number2 = doMethod(j, number1, listObj[2])
if number2 < 0: continue
for k in range(6):
number3 = doMethod(k, number2, listObj[3])
if abs(number3 - 24) < 0.01:
printSet.add(printEquation(listObj, i, j, k))
if len(printSet) > 0:
for name in printSet:
print("24 = " + name)
else:
print("無解")
else:
print("無解")
else:
print("無解")
else:
print("無解")