华为机试题--24点(python实现)

1.题目简述

       计算 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 ”表示无解。

2. 示例

(1) 4  2  K  A

          K-A*4/2

(2)A  A  A  A

         NONE

3. 代码

import itertools
while True:
    try:
        in_ = input()
        op=["+","-","*","/"]
        if ("Joker" in in_) or ("JOKER" in in_):
            print("ERROR")
            break
        list_in = in_.split()
        list_trans = []
        #转换JQKA
        for i in list_in:
            if i=="J":
                list_trans.append("11")
            elif i=="Q":
                list_trans.append("12")
            elif i=="K":
                list_trans.append("13")
            elif i=="A":
                list_trans.append("1")
            else:
                list_trans.append(i)
        #遍历所有符号和数字组合
        def cal(d1,d2,d3,d4,op1,op2,op3):
            sum = 0
            
            if op1==0:
                sum = d1+d2
            elif op1==1:
                sum = d1-d2
            elif op1==2:
                sum = d1*d2
            elif op1==3:
                if d1%d2==0:
                    sum = d1//d2
                else:
                    return 0
            if op2==0:
                sum += d3
            elif op2==1:
                sum -= d3
            elif op2==2:
                sum *= d3
            elif op2==3:
                if sum%d3==0:
                    sum = sum//d3
                else:
                    return 0
            if op3==0:
                sum += d4
            elif op3==1:
                sum -= d4
            elif op3==2:
                sum *= d4
            elif op3==3:
                if sum%d4==0:
                    sum = sum//d4
                else:
                    return 0
            return sum
        result = ""
        endTarg = False
        #第一个for实现四张牌的全排列
        #后面三个for实现运算符的所有组合
        for order_ in itertools.permutations("0123",4):
            for i in range(4):
                for j in range(4):
                    for k in range(4):
                        if(cal(int(list_trans[int(order_[0])]),int(list_trans[int(order_[1])]),int(list_trans[int(order_[2])]),int(list_trans[int(order_[3])]),i,j,k)==24):
                            result = list_trans[int(order_[0])]+op[i]+list_trans[int(order_[1])]+op[j]+list_trans[int(order_[2])]+op[k]+list_trans[int(order_[3])]
                            #已经生成最终结果,在改回扑克牌的形式
                            if("11" in result):
                                result = result.replace("11","J")
                            if "12" in result:
                                result = result.replace("12","Q")
                            if "13" in result:
                                result = result.replace("13","K")
                            if "1" in result:
                                result = result.replace("1","A")
                            endTarg = True
                        if endTarg==True:
                            break
                    if endTarg==True:
                        break
                if endTarg==True:
                    break
            if endTarg==True:
                break
        if endTarg==False:
            print("NONE",end="")
        else:
            print(result)
    except:
        break

 

 

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值