环境:python 3.7
直接上代码
# 输入 2 个表达式
# 输出这 2 个表达式,各自作为整体,经过四则运算的所有可能结果,输出格式是字典 {表达式:值}
# # # 说明:
# 输入、输出的表达式最外围均有小括号(对于输入,如果输入的是数字则不需要加小括号)
# 加法、乘法均以大的数字在前、小的数字在后的格式显示;
# 减法只保留大减小的那一种情况;
# 除法的两种可能均保留(当然前提是除数非 0 )
# 最多一共会有 5 种结果
def combine_exps_2(exp_a, exp_b):
# 使 a 为较大的那个数
if eval(exp_a) < eval(exp_b):
exp_c = exp_a
exp_a = exp_b
exp_b = exp_c
# 生成所有可能的表达式
ops = ["+", "-", "*"]
exps = ['(' + exp_a + op + exp_b + ')' for op in ops]
values = [eval(exp) for exp in exps]
results = dict(zip(exps, values))
if eval(exp_b) != 0:
new_exp = '(' + exp_a + '/' + exp_b + ')'
results[new_exp] = eval(new_exp)
if eval(exp_a) != 0:
new_exp = '(' + exp_b + '/' + exp_a + ')'
results[new_exp] = eval(new_exp)
return results
# 输入 3 个表达式
# 输出这 3 个表达式,各自作为整体,经过四则运算的所有可能结果,输出格式是字典 {表达式:值}
# # # 说明:
# 基于且类似于 combine_exps_2
def combine_exps_3(exp_a, exp_b, exp_c):
results = {}
exps = [exp_a, exp_b, exp_c]
for idx in range(3):
e0 = exps[idx]
e1, e2 = exps[:idx] + exps[idx + 1:]
combinations_e1_e2 = combine_exps_2(e1, e2)
for a_combination_e1_e2 in combinations_e1_e2:
results.update(combine_exps_2(e0, a_combination_e1_e2))
return results
# 输入 4 个表达式
# 输出这 4 个表达式,各自作为整体,经过四则运算的所有可能结果,输出格式是字典 {表达式:值}
# # # 说明:
# 基于且类似于 combine_exps_2, combine_exps_3
def combine_exps_4(exp_a, exp_b, exp_c, exp_d):
results = {}
exps = [exp_a, exp_b, exp_c, exp_d]
# 把 4 分解成 2 + 1 + 1,再使用 combine_exps_3 即可
# 选取 “2”(剩下的就是 “1 + 1”)
possibilities = []
for i in range(3):
for j in range(i + 1, 4):
possibilities += [[i, j]]
# 生成所有结果
for lucky_dog_pair_idxes in possibilities:
leftover_pair_idxes = [i for i in range(4) if i not in lucky_dog_pair_idxes]
lucky_dog_pair = [exps[i] for i in lucky_dog_pair_idxes]
leftover_1, leftover_2 = [exps[i] for i in leftover_pair_idxes]
lucky_dog_pair_combinations = combine_exps_2(lucky_dog_pair[0], lucky_dog_pair[1])
for lucky_dog_pair_combination in lucky_dog_pair_combinations:
results.update(combine_exps_3(lucky_dog_pair_combination, leftover_1, leftover_2))
return results
# 输入一个含有 4 个整数的数组
# 输出用这 4 个整数,通过四则运算组合出 24 的所有方式(输出的是具体的运算表达式)
def clock24(arr):
results = []
exp_a, exp_b, exp_c, exp_d = [str(num) for num in arr]
arr_combinations = combine_exps_4(exp_a, exp_b, exp_c, exp_d)
for comb in arr_combinations:
if arr_combinations[comb] == 24:
results.append(comb)
return results
# 示例
clock24_res = clock24([1, 3, 5, 7])
for re in clock24_res:
print(re)



