python实现算24的算法
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)
原创博文,如有转载,请注清出处哈。
python实现算24的算法的更多相关文章
- Python秒算24点,行还是不行?
周末闲来无事,看到隔壁家的老王在和隔壁家的媳妇玩24点,就进屋看了看.发现老王是真不行啊,那不行,这也不行. 就连个24点都玩不过他媳妇,给他媳妇气的,啥都不能满足,这不能,那也不能. 我坐下来和他媳 ...
- python 穷举法 算24点(史上最简短代码)
本来想用回溯法实现 算24点.题目都拟好了,就是<python 回溯法 子集树模板 系列 -- 7.24点>.无奈想了一天,没有头绪.只好改用暴力穷举法. 思路说明 根据四个数,三个运算符 ...
- 【Nodejs】“快算24”扑克牌游戏算法
算24是一款扑克牌游戏,它的游戏方式是把四张牌的牌面数值通过四则运算得到结果24,四张牌必须仅用一次.这是一种挺好的锻炼孩子算数能力的扑克牌游戏. 各地玩法还有点差别,有的只算1-10,其它抽出来:有 ...
- 【Nodejs】“快算24”扑克牌游戏算法 1.02
快算24是一种挺好的锻炼孩子算数能力的扑克牌游戏,它的游戏方式是把四张牌的牌面数值通过有限四则运算得到结果24,四张牌必须仅用一次.各地玩法还有点差别,有的只算1-10,其它抽出来:有的地方把整幅牌都 ...
- 【Nodejs】“快算24”扑克牌游戏算法 1.01
考虑到1.00版本需要改源码变更四个数字,这版修改了一下变成控制台输入了. 先把两个数四则运算得到结果想清楚就是C2代码,三个数就是C3,四个数就是C4.简单的代码简单,却是复杂的基础:复杂的脱胎于简 ...
- Python之路,Day21 - 常用算法学习
Python之路,Day21 - 常用算法学习 本节内容 算法定义 时间复杂度 空间复杂度 常用算法实例 1.算法定义 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的 ...
- python平台下实现xgboost算法及输出的解释
python平台下实现xgboost算法及输出的解释 1. 问题描述 近来, 在python环境下使用xgboost算法作若干的机器学习任务, 在这个过程中也使用了其内置的函数来可视化树的结果, ...
- 小姐姐带你一起学:如何用Python实现7种机器学习算法(附代码)
小姐姐带你一起学:如何用Python实现7种机器学习算法(附代码) Python 被称为是最接近 AI 的语言.最近一位名叫Anna-Lena Popkes的小姐姐在GitHub上分享了自己如何使用P ...
- python机器学习笔记:EM算法
EM算法也称期望最大化(Expectation-Maximum,简称EM)算法,它是一个基础算法,是很多机器学习领域的基础,比如隐式马尔科夫算法(HMM),LDA主题模型的变分推断算法等等.本文对于E ...
随机推荐
- C++读取csv表格文件到vector
这个CSV文件假设知道每行有多少个数,也知道数据的格式,即可使用下面简单的方法实现. 我们假设每行有4个数据,依次是int,int,float,float 基本思路是:把每行的数据定为一个类型,放在v ...
- 关于request、response转发与重定向的简述
在做页面的请求与响应的时候我们多用request与response进行操作,而我们大家也知道,request是表示用户发向服务器的请求,而response是对用户请求的一个响应. 关于转发和重定向,通 ...
- python基础学习(十三)
re模块包含对 正则表达式.本章会对re模块主要特征和正则表达式进行介绍. 什么是正则表达式 正则表达式是可以匹配文本片段的模式.最简单的正则表达式就是普通字符串,可以匹配其自身.换包话说,正则表达式 ...
- [WPF]如何调试Data Binding
前言 在WPF开发中,将ViewModel中对象绑定到UI上时,会出现明明已经将数据对象Binding到UI,但是UI上就是不显示等等的问题.这篇博客将介绍WPF Data Binding相关的内容, ...
- jmeter响应断言
jmeter提供了很多种断言,本文我就介绍下我们经常使用的响应断言! 响应断言 :对服务器的响应进行断言校验 (1).应用范围Apply to : Main sample and sub-sample ...
- sed修炼系列(一):花拳绣腿之入门篇
本文为花拳绣腿招式入门篇,主要目的是入门,为看懂sed修炼系列(二):武功心法做准备.虽然是入门篇,只介绍了基本工作机制以及一些选项和命令,但其中仍然包括了很多sed的工作机制细节.对比网上各sed相 ...
- Day-9: 面对对象高级编程
数据封装.继承和多态只是面向对象编程中最基础的3个概念. 下面整理面向对象高级编程的更为强大的技巧. 使用__slots__:Python属于动态语言,可以允许已创建好的类动态地绑定任何属性和方法.但 ...
- iBatis的一个问题
写了一段查询语句,条件中有一条alarmtype<>'1004'这样的条件,原来是这样写的 <![CATA[ and alarmtype<>'1004']]> 然后 ...
- mysql外键设置选项
. cascade方式 在父表上update/delete记录时,同步update/delete掉子表的匹配记录 . set null方式 在父表上update/delete记录时,将子表上匹配记录的 ...
- 201521123088《Java程序设计》第七周学习总结
1. 本周学习总结 以你喜欢的方式(思维导图或其他)归纳总结集合相关内容. 2. 书面作业 ArrayList代码分析1.1 解释ArrayList的contains源代码源代码: //contain ...