(第一次综合训练)安全16级2班第5组
#-*- coding:utf-8 -*-
'''
----------------小组信息--------------
组长:唐朝
成员:刘光璞,王鹏飞,王宁伟
------------------------------------
-------------
第7题 任意输入4位数字,利用+-×÷四则运算使之得到24。输出 所有不同算法的计算表达式,可为运算优先级而使用括号。
'''
# -*- coding:utf-8 -*-
# -*- coding:utf-8 -*-
numlist = []
for i in range(4):
numlist.append(float(raw_input('请输入第%d个数:'%(i+1))))#输入任意四个数
nlist = [(numlist[0], numlist[1], numlist[2], numlist[3]), (numlist[0], numlist[1], numlist[3], numlist[2]), (numlist[0], numlist[2], numlist[1], numlist[3]), (numlist[0], numlist[2], numlist[3], numlist[1]), (numlist[0], numlist[3], numlist[1], numlist[2]), (numlist[0], numlist[3], numlist[2], numlist[1]), (numlist[1], numlist[0], numlist[2], numlist[3]), (numlist[1], numlist[0], numlist[3], numlist[2]), (numlist[1], numlist[2], numlist[0], numlist[3]), (numlist[1], numlist[2], numlist[3], numlist[0]), (numlist[1], numlist[3], numlist[0], numlist[2]), (numlist[1], numlist[3], numlist[2], numlist[0]), (numlist[2], numlist[0], numlist[1], numlist[3]), (numlist[2], numlist[0], numlist[3], numlist[1]), (numlist[2], numlist[1], numlist[0], numlist[3]), (numlist[2], numlist[1], numlist[3], numlist[0]), (numlist[2], numlist[3], numlist[0], numlist[1]), (numlist[2], numlist[3], numlist[1], numlist[0]), (numlist[3], numlist[0], numlist[1], numlist[2]), (numlist[3], numlist[0], numlist[2], numlist[1]), (numlist[3], numlist[1], numlist[0], numlist[2]), (numlist[3], numlist[1], numlist[2], numlist[0]), (numlist[3], numlist[2], numlist[0], numlist[1]), (numlist[3], numlist[2], numlist[1], numlist[0])]
# print nlist 不重复的4个数的所有排序
olist = [('+', '+', '+'), ('+', '+', '-'), ('+', '+', '*'), ('+', '+', '/'), ('+', '-', '+'), ('+', '-', '-'), ('+', '-', '*'), ('+', '-', '/'), ('+', '*', '+'), ('+', '*', '-'), ('+', '*', '*'), ('+', '*', '/'), ('+', '/', '+'), ('+', '/', '-'), ('+', '/', '*'), ('+', '/', '/'), ('-', '+', '+'), ('-', '+', '-'), ('-', '+', '*'), ('-', '+', '/'), ('-', '-', '+'), ('-', '-', '-'), ('-', '-', '*'), ('-', '-', '/'), ('-', '*', '+'), ('-', '*', '-'), ('-', '*', '*'), ('-', '*', '/'), ('-', '/', '+'), ('-', '/', '-'), ('-', '/', '*'), ('-', '/', '/'), ('*', '+', '+'), ('*', '+', '-'), ('*', '+', '*'), ('*', '+', '/'), ('*', '-', '+'), ('*', '-', '-'), ('*', '-', '*'), ('*', '-', '/'), ('*', '*', '+'), ('*', '*', '-'), ('*', '*', '*'), ('*', '*', '/'), ('*', '/', '+'), ('*', '/', '-'), ('*', '/', '*'), ('*', '/', '/'), ('/', '+', '+'), ('/', '+', '-'), ('/', '+', '*'), ('/', '+', '/'), ('/', '-', '+'), ('/', '-', '-'), ('/', '-', '*'), ('/', '-', '/'), ('/', '*', '+'), ('/', '*', '-'), ('/', '*', '*'), ('/', '*', '/'), ('/', '/', '+'), ('/', '/', '-'), ('/', '/', '*'), ('/', '/', '/')]
#所有的运算符的排列
# print olist 所有运算符的排列
retlist=[]
for nl in nlist :
for ol in olist: #将3个运算符号插入到4个数中
re = [str(nl[0])+'*1.0']+[ol[0]]+[str(nl[1])+'*1.0']+[ol[1]]+[str(nl[2])+'*1.0']+[ol[2]]+[str(nl[3])+'*1.0'] #连接插入运算符
retlist.append(re) #形成带运算符号的数字新列表
lastlist = [] #建立终极列表-带有运算符以及括号的所有式子
for ret in retlist: #通过循环判断是否可加入括号
if ('*' not in ret and '/' not in ret) or ('*' in ret and '/' in ret): #只存在加减或者乘除时不添加括号
lastlist.append(''.join(ret))
else: #混合运算时加入括号 #使用强大的join链接括号于式子 #每一个字符占一位1234567,形如
lastlist.append(''.join(['(']+ret[:3]+[')']+ret[3:])) #(1A3)B5C7
lastlist.append(''.join(['(']+ret[:5]+[')']+ret[5:])) #(1A3B5)C7
lastlist.append(''.join(ret[:2]+['(']+ret[2:5]+[')']+ret[5:])) #1A(3B5)C7
lastlist.append(''.join(ret[:2]+['(']+ret[2:7]+[')'])) #1A(3B5C7)
lastlist.append(''.join(ret[:4]+['(']+ret[4:7]+[')'])) #1A3B(5C7)
lastlist.append(''.join(['(']+ret[:3]+[')']+ret[3:4]+['(']+ret[4:7]+[')'])) #(1A3)B(5C7)
# print lastlist
i = 0
j = 1
for ll in lastlist:
try:
if eval(ll) == 24: # 计算,eval十分强大:将字符串str当成有效的表达式来求值并返回计算结果,核心
print '第',j,'个符合的式子:',ll.replace('*1.0','')+'=24' #去掉'*1.0',显示结果会有一部分不显示1.0
j+=1 #结果的个数
else:
i += 1
except:
#print '除于0错误: '+ll.replace('*1.0','') #表达式中有除于0的
i += 1 #作为最终无解的判断
if i == len(lastlist):#即所有的运算结果都不等于24
print '抱歉,所输入四位数不能构成24'