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 ...
随机推荐
- Thinkphp报错 -- “_STORAGE_WRITE_ERROR_”
磁盘满了 没有写入权限 解决方法: chmod -R 777 Runtime目录路径
- WebGL开发入门
Getting started with WebGL development WebGL开发入门 What is Unity WebGL? 什么是Unity WebGL? The WebGL b ...
- 【渗透课程】第一篇-Web渗透需要接触的语言
---恢复内容开始--- 上一篇我们讲过了,Web渗透的基本原理,在原理中我们也提到了Web应用程序(脚本语言),本章就谈到了Web渗透要涉及的语言. 涉及语言: 1.html:是前段语言的其中一个, ...
- Capacitor电容
capacitor无正负极性. cap electrolit有极性,实际中不能接反,否则电容会烧毁或爆炸. MULTISIM仿真中接反会有漏阻存在,但不会烧毁. 电容的分类 按结构可分为:固定电容,可 ...
- sqlplus命令历史解决方案
在Linux上使用sqlplus比较痛苦,因为不能使用上下方向键来调出命令历史,也不能使用左右键移动光标对输入的命令进行修改,甚至连Backspace键都不能用(不过我发现大部分Backspace不能 ...
- live事件的替代方法on的使用注意事项
根据jQuery的官方描述,live方法在1.7中已经不建议使用,在1.9中删除了这个方法.并建议在以后的代码中使用on方法来替代. on方法可以接受三个参数:事件名.触发选择器.事件函数. 需要特别 ...
- Redis订阅和发布模式和Redis事务
-------------------Redis订阅和发布模式------------------- 1.概念 Redis 发布订阅(pub/sub)是一种消息通信模式: 发送者(pu ...
- ubuntu 14.04中安装phpmyadmin即mysql图形管理界面
由于学习的需要,我将网站开发环境从windows转移到了ubuntu,ubuntu下之前并没有发现什么难的地方,只要百度一般都有解决方案.但是总所周知ubuntu是一系列开源软件的集合,由于版本的问题 ...
- G1垃圾收集器和CMS垃圾收集器 (http://mm.fancymore.com/reading/G1-CMS%E5%9E%83%E5%9C%BE%E7%AE%97%E6%B3%95.html#toc_8)
参考来源 JVM 体系架构 堆/栈的内存分配 静态和非静态方法的内存分配 CMS 回收算法 应用场景 CMS 垃圾收集阶段划分(Collection Phases) CMS什么时候启动 CMS缺点 G ...
- java初阶
java的开发工具分成 IDE(integrated developmentenvironment )和JDk(Java Development Kit) 一个.java中只能有一个public类且至 ...