您的位置:首页 > 编程语言 > Python开发

python实现算24的算法

2017-09-23 11:07 239 查看
1.介绍

  给定4个整数,数字范围在1-13之间,任意使用 + - * / ( ) ,构造出一个表达式,使得最终结果为24,这就是常见的算24的游戏。本文介绍用Python语言实现的两种方式。
2.实现思路

  实现输入4个数字的排列组合,这样等于实现了括号的功能,然后使用+ - * /进行组合计算。
  第一种使用简写的方式,比第二种更好用。
  第二种按一般的实现思路,加有注释,更易看懂。

3.代码实现

3.1 第一种,使用列表的切片操作实现排列组合,使用异常进行下一次循环。

# encoding=utf-8
a = int(input("请输入第1个数字:"))
b = int(input("请输入第2个数字:"))
c = int(input("请输入第3个数字:"))
d = int(input("请输入第4个数字:"))
list1 = [a, b, c, d]
list2 = []
list3 = []
symbols = ["+", "-", "*", "/"]
class FindException(Exception):
pass
try:
for i in range(4):
one = list1[i]
list2 = list1[0:i] + list1[i + 1:]
for j in range(3):
two = list2[j]
list3 = list2[0:j] + list2[j + 1:]
for k in range(2):
three = list3[k]
four = (list3[0:k] + list3[k + 1:])[0]
for s1 in symbols:
for s2 in symbols:
for s3 in symbols:
express = "((one {0} two) {1} three) {2} four".format(s1, s2, s3)
if eval(express) == 24:
print("(({0} {1} {2}) {3} {4}) {5} {6} = 24".format(one, s1, two, s2, three, s3, four))
raise FindException
print("无法算出")
except FindException:
pass


3.2 第二种,使用itertools模块实现排列组合,使用变量val1,val2等变量存储中间变量,以达到进行下一次循环的效果。

# encoding=utf-8
# 用你熟悉的程序语言实现 算24 的算法
# 已知4个整数,数字范围在1-13之间,求计算方法(限加减乘除,可带括号),可以计算出24
import itertools
import copy
a = int(input("请输入第1个数字:"))
b = int(input("请输入第2个数字:"))
c = int(input("请输入第3个数字:"))
d = int(input("请输入第4个数字:"))
inputList = [a, b, c, d]
listAll = []  # 用来存储这个列表数字的排列组合 [[],[],[],[]......]
listSignIndex = []  # 用来存储输出的运算符号顺序下表 0,1,2,3 对应 + - * /
listSign = []  # 用来存储输出的运算符号 + - * /
listSet = list(itertools.permutations(inputList, 4))  # 无序排列组合
for i in listSet:
listAll.append(list(i))  # 用list()把元组转换成列表
# 把运算符号的下表转换成对应的符号
def changeIndexToSign():
for i in listSignIndex:
if i == 0:
listSign.append("+")
elif i == 1:
listSign.append("-")
elif i == 2:
listSign.append("*")
elif i == 3:
listSign.append("/")
last = []
def start():
global last
while 1:
for list1 in listAll:
val = list1[0]
last = copy.deepcopy(list1)
for i in range(4):
if i == 0:
val += list1[1]
elif i == 1:
val -= list1[1]
elif i == 2:
val *= list1[1]
elif i == 3:
val /= list1[1]
val2 = val  # 保存当前的val值 即list1[0] list1[1]运算的值
for j in range(4):
if j == 0:
val += list1[2]
elif j == 1:
val -= list1[2]
elif j == 2:
val *= list1[2]
elif j == 3:
val /= list1[2]
val1 = val  # 保存当前的val值 即list1[0] list1[1] list[2]运算的值
for k in range(4):
if k == 0:
val += list1[3]
elif k == 1:
val -= list1[3]
elif k == 2:
val *= list1[3]
elif k == 3:
val /= list1[3]
if val == 24:
listSignIndex.append(i)
listSignIndex.append(j)
listSignIndex.append(k)
changeIndexToSign()
return
else:
val = val1  # 如果这次循环不行,就把那么把val还置为list1[0] list1[1] list[2]运算的值
val = val2  # 如果第3值运算完了没有结束,那么把val还置为list1[0] list1[1]运算的值
val = list1[0]  # 如果第3,第4 值运算完了没有结束,那么把val还置为list1[0]值
start()
listSign.append("");
lastStr = "(("
for i in range(4):
if i == 1 or i == 2:
lastStr += str(last[i]) + ")" + listSign[i]
else:
lastStr += str(last[i]) + listSign[i]
print(lastStr)


原创博文,如有转载,请注清出处哈。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: