四则运算

24点运算——华为

题目描述

计算24点是一种扑克牌益智游戏,随机抽出4张扑克牌,通过加(+),减(-),乘(*), 除(/)四种运算法则计算得到整数24,本问题中,扑克牌通过如下字符或者字符串表示,其中,小写joker表示小王,大写JOKER表示大王: 

                   3 4 5 6 7 8 9 10 J Q K A 2 joker JOKER

本程序要求实现:输入4张牌,输出一个算式,算式的结果为24点。 

详细说明: 

1.运算只考虑加减乘除运算,没有阶乘等特殊运算符号,友情提醒,整数除法要当心; 

2.牌面2~10对应的权值为2~10, J、Q、K、A权值分别为为11、12、13、1; 

3.输入4张牌为字符串形式,以一个空格隔开,首尾无空格;如果输入的4张牌中包含大小王,则输出字符串“ERROR”,表示无法运算; 

4.输出的算式格式为4张牌通过+-*/四个运算符相连,中间无空格,4张牌出现顺序任意,只要结果正确; 

5.输出算式的运算顺序从左至右,不包含括号,如1+2+3*4的结果为24

6.如果存在多种算式都能计算得出24,只需输出一种即可,如果无法得出24,则输出“NONE”表示无解。

输入描述:

输入4张牌为字符串形式,以一个空格隔开,首尾无空格;

输出描述:

如果输入的4张牌中包含大小王,则输出字符串“ERROR”,表示无法运算;

输入输出
A A A ANONE

 代码:

from itertools import permutations
while True:
    try:
        # 直接暴力枚举
        def game24(nums):
            mydict={'A': '1', '2': '2', '3': '3', '4': '4', '5': '5', '6': '6', '7': '7', '8': '8', '9': '9', '10': '10',
                           'J': '11', 'Q': '12', 'K': '13'}
            exp = '((%s %s %s) %s %s )%s %s'  ## 这道题默认括号是这么加的
            for data in permutations(nums):
                for op1 in ['+', '-', '*', '/']:
                    for op2 in ['+', '-', '*', '/']:
                        for op3 in ['+', '-', '*', '/']:
                            m= True if check(
                                exp%(mydict[data[0]],op1,mydict[data[1]],op2,mydict[data[2]],op3,mydict[data[3]])) else False
                            if m :
                                return  str(data[0]) + op1 + str(data[1]) + op2 + str(data[2]) + op3 + str(data[3])
            return 'NONE'
        
        def check(exp):  # 为了排除中间/0的情况,并且若等式值为24,返回True
            try:
                return int(eval(exp) == 24)
            except:
                return False
        
        
        pokers = input().split(' ')
        if 'joker' in pokers or 'JOKER' in pokers:
            print('ERROR')
        else:
            print(game24(pokers))
    except:
        break

扑克牌四则运算——小米

题目描述

现在有一幅扑克牌,去掉大小王52张牌。随机选出4张牌,可以任意改变扑克牌的顺序,并填入 + - * / 四个运算符,不用考虑括号,除法按整数操作,计算过程中没有浮点数,问是否能够求值得到给定的数m。

输入描述:

一行四个数字 (JQK 分别被替换成11,12,13)单空格分割,另一行输入 m

输出描述:

可以输出1
否则输出0
输入输出
13 13 13 13
24
0

提示: 注意运算符优先级

代码1:

from itertools import permutations  #生成列表全排列
data = [int(x) for x in input().split()]
# print(permutations(data))
m = int(input())
n=3
flage=False
def fun(data,string):
    global flage
    if len(data)==1:
        if eval(string+str(data[0]))==m:
            print(string+str(data[0]))
            flage=True
        return 0
    else:
        fun(data[1:],string+str(data[0])+'+')
        fun(data[1:], string+str(data[0]) + '-')
        fun(data[1:], string+str(data[0]) + '*')
        fun(data[1:], string+str(data[0]) + '//')
for data_p in permutations(data):  
    # print(data_p)
    fun(data_p,'')
# print(flage)
if flage:
    print(1)
else:
    print(0)

代码2:

from itertools import permutations

# 直接暴力枚举
def solve(nums, m):
    # 生成所有数字排列
    for data in permutations(nums):
        for op1 in ['+', '-', '*', '//']:
            for op2 in ['+', '-', '*', '//']:
                for op3 in ['+', '-', '*', '//']:
                    if m == eval(str(data[0]) + op1 + str(data[1]) + op2 + str(data[2]) + op3 + str(data[3])):
                        print(str(data[0]) + op1 + str(data[1]) + op2 + str(data[2]) + op3 + str(data[3]))
                        return 1
    return 0

nums = list(map(int, input().split()))
m = int(input())
print(solve(nums, m))

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值