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的算法的更多相关文章

  1. Python秒算24点,行还是不行?

    周末闲来无事,看到隔壁家的老王在和隔壁家的媳妇玩24点,就进屋看了看.发现老王是真不行啊,那不行,这也不行. 就连个24点都玩不过他媳妇,给他媳妇气的,啥都不能满足,这不能,那也不能. 我坐下来和他媳 ...

  2. python 穷举法 算24点(史上最简短代码)

    本来想用回溯法实现 算24点.题目都拟好了,就是<python 回溯法 子集树模板 系列 -- 7.24点>.无奈想了一天,没有头绪.只好改用暴力穷举法. 思路说明 根据四个数,三个运算符 ...

  3. 【Nodejs】“快算24”扑克牌游戏算法

    算24是一款扑克牌游戏,它的游戏方式是把四张牌的牌面数值通过四则运算得到结果24,四张牌必须仅用一次.这是一种挺好的锻炼孩子算数能力的扑克牌游戏. 各地玩法还有点差别,有的只算1-10,其它抽出来:有 ...

  4. 【Nodejs】“快算24”扑克牌游戏算法 1.02

    快算24是一种挺好的锻炼孩子算数能力的扑克牌游戏,它的游戏方式是把四张牌的牌面数值通过有限四则运算得到结果24,四张牌必须仅用一次.各地玩法还有点差别,有的只算1-10,其它抽出来:有的地方把整幅牌都 ...

  5. 【Nodejs】“快算24”扑克牌游戏算法 1.01

    考虑到1.00版本需要改源码变更四个数字,这版修改了一下变成控制台输入了. 先把两个数四则运算得到结果想清楚就是C2代码,三个数就是C3,四个数就是C4.简单的代码简单,却是复杂的基础:复杂的脱胎于简 ...

  6. Python之路,Day21 - 常用算法学习

    Python之路,Day21 - 常用算法学习   本节内容 算法定义 时间复杂度 空间复杂度 常用算法实例 1.算法定义 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的 ...

  7. python平台下实现xgboost算法及输出的解释

    python平台下实现xgboost算法及输出的解释 1. 问题描述 ​ 近来, 在python环境下使用xgboost算法作若干的机器学习任务, 在这个过程中也使用了其内置的函数来可视化树的结果, ...

  8. 小姐姐带你一起学:如何用Python实现7种机器学习算法(附代码)

    小姐姐带你一起学:如何用Python实现7种机器学习算法(附代码) Python 被称为是最接近 AI 的语言.最近一位名叫Anna-Lena Popkes的小姐姐在GitHub上分享了自己如何使用P ...

  9. python机器学习笔记:EM算法

    EM算法也称期望最大化(Expectation-Maximum,简称EM)算法,它是一个基础算法,是很多机器学习领域的基础,比如隐式马尔科夫算法(HMM),LDA主题模型的变分推断算法等等.本文对于E ...

随机推荐

  1. 也来谈谈IT培训

    园子里这篇博客火了:谈谈培训机构的"骗局"给新人一些建议,刚好我也一直被问到这个话题,今天就凑个热闹,一吐为快吧. 我从包工头转行做开发,是进了培训班的,但两年的课程,我只学了半年 ...

  2. Java线程池之ThreadPoolExecutor

    前言 线程池可以提高程序的并发性能(当然是合适的情况下),因为对于没有线程的情况下,我们每一次提交任务都新建一个线程,这种方法存在不少缺陷: 1.  线程的创建和销毁的开销非常高,线程的创建需要时间, ...

  3. java创建目录与文件

    java创建目录与文件: package com.led.file; import java.io.File; import java.io.IOException; public class Fil ...

  4. Kettle6.0表输入连接数据库

    kettle6.0表输入我们需要从数据中获取数据的时候,需要和数据库建立连接,简单的说下步骤: 1.双击表输入: 2.点击"新建",输入参数值: 注意:数据库用户名可以通过sql进 ...

  5. 后PMP时代下的敏捷项目管理全国在线讲座

    活动时间:2017年9月7日(周四)  19:00-21:00 活动形式:在线直播 本次活动免费 互联网经济冲击下,产品创新成为企业生存的关键,"双模"成为很多企业必然的选择,传统 ...

  6. web安全普及:通俗易懂,如何让网站变得更安全?以实例来讲述网站入侵原理及防护。

    本篇以我自己的网站[http://www.1996v.com]为例来通俗易懂的讲述如何防止网站被入侵,如何让网站更安全. 要想足够安全,首先得知道其中的道理. 本文例子通俗易懂,从"破解网站 ...

  7. live事件的替代方法on的使用注意事项

    根据jQuery的官方描述,live方法在1.7中已经不建议使用,在1.9中删除了这个方法.并建议在以后的代码中使用on方法来替代. on方法可以接受三个参数:事件名.触发选择器.事件函数. 需要特别 ...

  8. ButterKnife的安装与使用以及ButterKnife右键不显示的大坑

    作为从安卓的的入门选手,第一次看到还以为是个第三方呢,从github下来之后感觉不对啊,这么多东西,后来一搜原来是个插件,而且不用从github上下载. 安装的方法很简单. 第一步:打开安卓studi ...

  9. poj 1384完全背包

    题意:给出猪罐子的空质量和满质量,和n个硬币的价值和质量,求猪罐子刚好塞满的的最小价值. 思路:选择硬币,完全背包问题,塞满==初始化为无穷,求最小价值,min. 代码: #include<io ...

  10. poj 3592 缩点+SPFA

    题意:给出一个矩阵,其中#代表墙,不可走,0-9代表权值,*代表可以选择传送.求从0,0点开始出发能获得最大权值. 思路:因为*的出现会有环的情况,先建图连边,将环进行Tarjan缩点,之后再从0,0 ...