用python算24点及原理详解
1 描述
给出4个正整数,使用加、减、乘、除4种运算以及括号把4个数连接起来得到一个结果等于24的表达式。
注:这里加、减、乘、除以及括号的运算结果和运算优先级跟平常定义一致。
例如,对于5,5,5,1,可知 5× (5-1/5) = 24。又如,对于 1,1,4,2 无论如何都不能得到24
1.1 输入格式
在代码中的输入部分输入4个正整数。
1.2 输出格式
对于每一组测试数据,如果可以得到24,输出"YES"其算法;否则输出“NO”。
2 大致思路
将四个数字进行全排列,在他们之间添加运算符号,最后将数字和操作符进行拼接运算。
运算符我们需要进行排列组合,因为只有四个数字,所以只需要三个运算符,而且算法符可能会重复,比如三个都是+。
再遍历四个数字的全排列,对每一组数字而言,遍历所有组合的操作符。最后将数字和操作符进行拼接运算,就可以得到最终结果了。
3 知识点补充
1、首先我们对所有数字进行去全排列,这里我们使用 itertools.permutations 来帮助我们完成。
iertools.permutations 用法演示
import itertoolsa = int(input("请输入第1个数字:"))
b = int(input("请输入第2个数字:"))
c = int(input("请输入第3个数字:"))
d = int(input("请输入第4个数字:"))my_list = [a, b, c, d]
result = [c for c in itertools.permutations(my_list, 4)]for i, r in enumerate(result):if i % 4 == 0:print()print(r, end="\t")
print("\n\n长度为:", len(result))
运行结果:
请输入第1个数字:1
请输入第2个数字:2
请输入第3个数字:3
请输入第4个数字:4(1, 2, 3, 4) (1, 2, 4, 3) (1, 3, 2, 4) (1, 3, 4, 2)
(1, 4, 2, 3) (1, 4, 3, 2) (2, 1, 3, 4) (2, 1, 4, 3)
(2, 3, 1, 4) (2, 3, 4, 1) (2, 4, 1, 3) (2, 4, 3, 1)
(3, 1, 2, 4) (3, 1, 4, 2) (3, 2, 1, 4) (3, 2, 4, 1)
(3, 4, 1, 2) (3, 4, 2, 1) (4, 1, 2, 3) (4, 1, 3, 2)
(4, 2, 1, 3) (4, 2, 3, 1) (4, 3, 1, 2) (4, 3, 2, 1) 长度为: 24
4 具体代码
from itertools import permutationsa = int(input("请输入第1个数字:"))
b = int(input("请输入第2个数字:"))
c = int(input("请输入第3个数字:"))
d = int(input("请输入第4个数字:"))
my_list = [a, b, c, d]
# 对4个整数随机排列的列表
result = [c for c in permutations(my_list, 4)]symbols = ["+", "-", "*", "/"]list2 = [] # 算出24的排列组合的列表flag = Falsefor one, two, three, four in result:for s1 in symbols:for s2 in symbols:for s3 in symbols:if s1 + s2 + s3 == "+++" or s1 + s2 + s3 == "***":express = ["{0}{1}{2}{3}{4}{5}{6}".format(one, s1, two, s2, three, s3, four)] # 全加或者乘时,括号已经没有意义。else:express = ["(({0}{1}{2}){3}{4}){5}{6}".format(one, s1, two, s2, three, s3, four),"({0}{1}{2}){3}({4}{5}{6})".format(one, s1, two, s2, three, s3, four),"(({0}{1}({2}{3}{4})){5}{6})".format(one, s1, two, s2, three, s3, four),"{0}{1}(({2}{3}{4}){5}{6})".format(one, s1, two, s2, three, s3, four),"{0}{1}({2}{3}({4}{5}{6}))".format(one, s1, two, s2, three, s3, four)]for e in express:try:if eval(e) == 24:list2.append(e)flag = Trueexcept ZeroDivisionError:passlist3 = set(list2) # 去除重复项for c in list3:print("YES:", c)if not flag:print("NO!")
5 BUG修复
感谢qq_44273902博主提出程序BUG,现进行BUG修复
5.1 问题分析
5.1.1 问题复现
输入3、3、8、8,进行问题复现
输出结果如下:
针对输出结果进行分析,明明是有正确答案的,为何还输出NO!???
5.1.2 原因分析
运行以下代码流程
print(8/(3-(8/3)))
运行结果:
了然,精度问题
5.2 针对问题进行解决
既然是由于精度问题造成的,那么可以约定保留6位小数点(当然也可以保留其他位数的小数),如此一来即可解决该问题。
将第36行代码
if eval(e) == 24:
改成
if round(eval(e), 6) == 24:
优化之后的代码如下:
from itertools import permutationsa = int(input("请输入第1个数字:"))
b = int(input("请输入第2个数字:"))
c = int(input("请输入第3个数字:"))
d = int(input("请输入第4个数字:"))
my_list = [a, b, c, d]
# 对4个整数随机排列的列表
result = [c for c in permutations(my_list, 4)]symbols = ["+", "-", "*", "/"]list2 = [] # 算出24的排列组合的列表flag = False
print(result)for one, two, three, four in result:for s1 in symbols:for s2 in symbols:for s3 in symbols:if s1 + s2 + s3 == "+++" or s1 + s2 + s3 == "***":express = ["{0}{1}{2}{3}{4}{5}{6}".format(one, s1, two, s2, three, s3, four)] # 全加或者乘时,括号已经没有意义。else:express = ["(({0}{1}{2}){3}{4}){5}{6}".format(one, s1, two, s2, three, s3, four),"({0}{1}{2}){3}({4}{5}{6})".format(one, s1, two, s2, three, s3, four),"(({0}{1}({2}{3}{4})){5}{6})".format(one, s1, two, s2, three, s3, four),"{0}{1}(({2}{3}{4}){5}{6})".format(one, s1, two, s2, three, s3, four),"{0}{1}({2}{3}({4}{5}{6}))".format(one, s1, two, s2, three, s3, four)]# print(one + two + three + four)if str(one) + str(two) + str(three) + str(four) == "8383":print(express)for e in express:try:# if eval(e) == 24:if round(eval(e), 6) == 24:list2.append(e)flag = Trueexcept ZeroDivisionError:passlist3 = set(list2) # 去除重复项for c in list3:print("YES:", c)if not flag:print("NO!")
用python算24点及原理详解相关推荐
- python sklearn.decomposition.PCA 主成分分析, 原理详解
引用文章1: 主成分分析(PCA)原理详解 https://blog.csdn.net/program_developer/article/details/80632779 引用文章2: 彻底理解样本 ...
- python压缩算法_LZ77压缩算法编码原理详解(结合图片和简单代码)
前言 LZ77算法是无损压缩算法,由以色列人Abraham Lempel发表于1977年.LZ77是典型的基于字典的压缩算法,现在很多压缩技术都是基于LZ77.鉴于其在数据压缩领域的地位,本文将结合图 ...
- python 管线原理图_Q-Q图原理详解及Python实现
QQ图是quantile-quantile(分位数-分位数图) 的简称,上面也有介绍它的两个主要作用: 1.检验一列数据是否符合正态分布 2.检验两列数据是否符合同一分布 Q-Q图的原理 要弄清Q-Q ...
- 活体检测眨眼、张嘴、点头、摇头动作一网打尽:人脸面部活体检测系统【含Python源码+PyqtUI界面+原理详解】
基本功能演示 摘要:活体检测是用于判断捕捉到的人脸是真实人脸,还是伪造的人脸攻击的一种技术手段.本文详细介绍了其实现的技术原理,同时给出完整的Python实现代码,并且通过PyQT实现了UI界面,更方 ...
- Python机器学习中的数学原理详解(补充勘误表)
数学是机器学习和数据科学的基础,任何期望涉足相关领域并切实领悟具体技术与方法的人都无法绕过数学这一关.在一篇题为<放弃幻想,搞AI必须过数学关>的网文中,作者一针见血地指出想从事AI相关工 ...
- python装饰器性能_python装饰器的特性原理详解
这篇文章主要介绍了python装饰器的特性原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 今天发现了装饰器的另一种用法,下面就先上代码: d ...
- python是基于什么原理_Python基于class()实现面向对象原理详解
首先,类是一个集合,包含了数据,操作描述的一个抽象集合 你可以首先只把类当做一个容器来使用 class Cycle: def __init__(self,r): self.pi=3.14 self.r ...
- python 编码解码原理_Python JSON编解码方式原理详解
这篇文章主要介绍了Python JSON编解码方式原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 概念 JSON(JavaScript Ob ...
- python函数定义及调用-python函数声明和调用定义及原理详解
这篇文章主要介绍了python函数声明和调用定义及原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 函数是指代码片段,可以重复调用,比如我们前 ...
- google authenticator python_Google Authenticator TOTP原理详解(以Python为例)
http://xsboke.blog.51cto.com 如果有疑问,请点击此处,然后发表评论交流,作者会及时回复(也可以直接在当前文章评论). -------谢谢您的参考,如有疑问,欢迎交流 一. ...
最新文章
- Ubuntu修改终端@前面的用户名
- 如何学习iphone游戏开发
- 2020年下信息系统项目管理师合格分数线通知
- oracle 兰贝斯_【咨询/顾问150-500人招聘_最新咨询/顾问150-500人招聘信息】-前程无忧...
- 【Pytorch神经网络实战案例】15 WGAN-gp模型生成Fashon-MNST模拟数据
- 黑马冠军快手在国际回声消除大赛中战绩颇丰
- IIS7部署网站的一些细节问题。
- 计算机二级vb语言题库百度云,全国计算机二级考试VB语言考试试题
- excel检验是否是正态分布-T分布
- 单反相机tf卡用sd卡套稳定吗_存储卡可不是插上就能用 单反相机的使用细节
- buck电路上下管_BUCK/BOOST电路原理
- 《重说中国近代史》—张鸣—(3)两个世界最初的碰撞(续)
- maven项目install报错:\target\surefire-reports for the individual test results
- [转载]中华桥梁先驱——茅以升
- 相机内参,外参的物理意义
- 【深度学习】---行人检测应用
- Redis的maven依赖
- K8s二进制部署-flanneld报(Couldn‘t fetch network config)
- 数学建模培训笔记记录--8.3
- 如何去除软件内嵌广告_iphone5去除应用软件内置广告教程(图文)
热门文章
- Ubuntu18.04 显卡驱动完美安装(解决安装后无法进入桌面)
- 史上最全linux内核配置--Device drivers
- 一级计算机考试试题评分标准,2014计算机一级上机试题(1—5套)评分标准
- 计算机测试代码怎么写,常见的电脑检测卡代码对照表大全
- 用计算机计算教学反思,《用计算器计算》的教学反思
- 计算机二级实践网上教程答案,全国计算机等级二级教程课后习题+答案
- 浪潮服务器一键还原系统,一键恢复 怎样做备份
- Cesium中的primitive流光轨迹
- html怎么在搜索框中加图片,html – 如何在搜索框中添加图标
- 计算机修复开机按什么,电脑蓝屏修复按哪个健?