问题
随意给出四个数字,通过加减乘除四则运算,可以得出24。
算法解决思路:
假设ABCD四个数字
- BCD三个数字进行四则运算得到E,然后A与E进行四则运算
- AB两个数字进行四则运算的得到E,CD两个数字进行四则运算得到F,然后E和F进行四则运行
- ABC三个数字进行四则运算得到E,然后E与D进行四则运算
- 判断以上情况得到的结果是否等于24,如果等于,则打印,否则不打印
- 随机生产四个数字
#----------------------------------------------------------------------
def get_numbers(num,min_value,max_value):
""""""
return list(np.random.randint(min_value,max_value+1,[num]))
返回的结果:
[12, 6, 3, 11]
- 对获得的列表进行数据处理
#----------------------------------------------------------------------
def get_2_sets(numbers):
""""""
result = []
for i, num in enumerate(numbers):
set1 = [num]
set2 = numbers.copy()
del set2[i]
result.append((set1,set2))
if len(numbers) < 4:
return result
if len(numbers) > 4:
return Exception(len(numbers))
for i , num in enumerate(numbers):
for j in range(i+1,len(numbers)):
set1 = [numbers[i],numbers[j]]
set2 = numbers.copy()
del set2[j]
del set2[i]
result.append((set1,set2))
return result
返回的result结果如下:
[([12], [6, 3, 11]),
([6], [12, 3, 11]),
([3], [12, 6, 11]),
([11], [12, 6, 3]),
([12, 6], [3, 11]),
([12, 3], [6, 11]),
([12, 11], [6, 3]),
([6, 3], [12, 11]),
([6, 11], [12, 3]),
([3, 11], [12, 6])]
- 对获得的列表进行四则运算
#----------------------------------------------------------------------
def make_result(numbers):
""""""
if len(numbers) == 1:
return [(numbers[0], str(numbers[0]))]
result = []
for set1,set2 in get_2_sets(numbers):
result1 = make_result(set1)
result2 = make_result(set2)
for value1 , s1 in result1:
for value2, s2 in result2:
result.append((value1+value2,f"({s1})+({s2})"))
result.append((value1*value2,f"({s1})*({s2})"))
result.append((value1-value2,f"({s1})-({s2})"))
if value2 != 0:
result.append((value1 / value2,f"({s1})/({s2})"))
result.append((value2-value1,f"({s2})-({s1})"))
if value1 != 0:
result.append((value2 / value1 , f"({s2})/({s1})"))
return result
运行结果如下:
(12)+((6)+((3)+(11)))
(12)*((6)+((3)+(11)))
(12)-((6)+((3)+(11)))
(12)/((6)+((3)+(11)))
((6)+((3)+(11)))-(12)
((6)+((3)+(11)))/(12)
(12)+((6)*((3)+(11)))
(12)*((6)*((3)+(11)))
(12)-((6)*((3)+(11)))
(12)/((6)*((3)+(11)))
((6)*((3)+(11)))-(12)
((6)*((3)+(11)))/(12)
(12)+((6)-((3)+(11)))
(12)*((6)-((3)+(11)))
(12)-((6)-((3)+(11)))
(12)/((6)-((3)+(11)))
((6)-((3)+(11)))-(12)
((6)-((3)+(11)))/(12)
(12)+((6)/((3)+(11)))
(12)*((6)/((3)+(11)))
(12)-((6)/((3)+(11)))
(12)/((6)/((3)+(11)))
((6)/((3)+(11)))-(12)
((6)/((3)+(11)))/(12)
(12)+(((3)+(11))-(6))
(12)*(((3)+(11))-(6))
(12)-(((3)+(11))-(6))
(12)/(((3)+(11))-(6))
(((3)+(11))-(6))-(12)
(((3)+(11))-(6))/(12)
(12)+(((3)+(11))/(6))
(12)*(((3)+(11))/(6))
(12)-(((3)+(11))/(6))
(12)/(((3)+(11))/(6))
(((3)+(11))/(6))-(12)
(((3)+(11))/(6))/(12)
(12)+((6)+((3)*(11)))
(12)*((6)+((3)*(11)))
(12)-((6)+((3)*(11)))
(12)/((6)+((3)*(11)))
((6)+((3)*(11)))-(12)
((6)+((3)*(11)))/(12)
(12)+((6)*((3)*(11)))
(12)*((6)*((3)*(11)))
(12)-((6)*((3)*(11)))
(12)/((6)*((3)*(11)))
((6)*((3)*(11)))-(12)
((6)*((3)*(11)))/(12)
(12)+((6)-((3)*(11)))
(12)*((6)-((3)*(11)))
(12)-((6)-((3)*(11)))
(12)/((6)-((3)*(11)))
((6)-((3)*(11)))-(12)
((6)-((3)*(11)))/(12)
(12)+((6)/((3)*(11)))
(12)*((6)/((3)*(11)))
(12)-((6)/((3)*(11)))
(12)/((6)/((3)*(11)))
((6)/((3)*(11)))-(12)
((6)/((3)*(11)))/(12)
(12)+(((3)*(11))-(6))
(12)*(((3)*(11))-(6))
(12)-(((3)*(11))-(6))
(12)/(((3)*(11))-(6))
(((3)*(11))-(6))-(12)
(((3)*(11))-(6))/(12)
(12)+(((3)*(11))/(6))
(12)*(((3)*(11))/(6))
(12)-(((3)*(11))/(6))
(12)/(((3)*(11))/(6))
(((3)*(11))/(6))-(12)
(((3)*(11))/(6))/(12)
(12)+((6)+((3)-(11)))
(12)*((6)+((3)-(11)))
(12)-((6)+((3)-(11)))
(12)/((6)+((3)-(11)))
((6)+((3)-(11)))-(12)
((6)+((3)-(11)))/(12)
(12)+((6)*((3)-(11)))
(12)*((6)*((3)-(11)))
(12)-((6)*((3)-(11)))
(12)/((6)*((3)-(11)))
((6)*((3)-(11)))-(12)
((6)*((3)-(11)))/(12)
(12)+((6)-((3)-(11)))
(12)*((6)-((3)-(11)))
(12)-((6)-((3)-(11)))
(12)/((6)-((3)-(11)))
((6)-((3)-(11)))-(12)
((6)-((3)-(11)))/(12)
(12)+((6)/((3)-(11)))
(12)*((6)/((3)-(11)))
(12)-((6)/((3)-(11)))
(12)/((6)/((3)-(11)))
((6)/((3)-(11)))-(12)
((6)/((3)-(11)))/(12)
(12)+(((3)-(11))-(6))
(12)*(((3)-(11))-(6))
(12)-(((3)-(11))-(6))
(12)/(((3)-(11))-(6))
(((3)-(11))-(6))-(12)
(((3)-(11))-(6))/(12)
(12)+(((3)-(11))/(6))
(12)*(((3)-(11))/(6))
(12)-(((3)-(11))/(6))
(12)/(((3)-(11))/(6))
(((3)-(11))/(6))-(12)
(((3)-(11))/(6))/(12)
(12)+((6)+((3)/(11)))
... ...
# 此处省略10368行
- 判断运算的结果是否是24
def make_24(numbers):
""""""
res = []
count = 0
for value,s in make_result(numbers):
print(s)
count += 1
if value == 24:
res.append(s)
print(count)
return res
运行结果为:
answers=['(12)*(((11)-(3))-(6))', '(12)*(((11)-(3))-(6))', '(12)*(((11)-(6))-(3))', '(12)*(((11)-(6))-(3))', '(12)*((11)-((6)+(3)))', '(12)*((11)-((3)+(6)))', '(6)*((12)+((3)-(11)))', '(6)*((12)-((11)-(3)))', '(6)*((12)-((11)-(3)))', '(6)*((12)+((3)-(11)))', '(6)*((3)+((12)-(11)))', '(6)*((3)-((11)-(12)))', '(6)*((3)-((11)-(12)))', '(6)*((3)+((12)-(11)))', '(6)*(((12)+(3))-(11))', '(6)*(((3)+(12))-(11))']
整体代码如下:
#-*- coding:utf-8 -*-
import numpy as np
#----------------------------------------------------------------------
def get_2_sets(numbers):
result = []
for i, num in enumerate(numbers):
set1 = [num]
set2 = numbers.copy()
del set2[i]
result.append((set1,set2))
if len(numbers) < 4:
return result
if len(numbers) > 4:
return Exception(len(numbers))
for i , num in enumerate(numbers):
for j in range(i+1,len(numbers)):
set1 = [numbers[i],numbers[j]]
set2 = numbers.copy()
del set2[j]
del set2[i]
result.append((set1,set2))
return result
#----------------------------------------------------------------------
def make_result(numbers):
if len(numbers) == 1:
return [(numbers[0], str(numbers[0]))]
result = []
for set1,set2 in get_2_sets(numbers):
result1 = make_result(set1)
result2 = make_result(set2)
for value1 , s1 in result1:
for value2, s2 in result2:
result.append((value1+value2,f"({s1})+({s2})"))
result.append((value1*value2,f"({s1})*({s2})"))
result.append((value1-value2,f"({s1})-({s2})"))
if value2 != 0:
result.append((value1 / value2,f"({s1})/({s2})"))
result.append((value2-value1,f"({s2})-({s1})"))
if value1 != 0:
result.append((value2 / value1 , f"({s2})/({s1})"))
return result
#----------------------------------------------------------------------
def make_24(numbers):
res = []
count = 0
for value,s in make_result(numbers):
print(s)
count += 1
if value == 24:
res.append(s)
return res
#----------------------------------------------------------------------
def get_numbers(num,min_value,max_value):
""""""
return list(np.random.randint(min_value,max_value+1,[num]))
if __name__ == "__main__":
numbers = get_numbers(4,1,13)
print(numbers)
answers = make_24(numbers)
print(f"answers={answers}")