CCF CSP 201903-2 二十四点

题目背景

二十四点是一款著名的纸牌游戏,其游戏的目标是使用3个加减乘除运算使得4张纸牌上的运算结果为24。

题目描述

定义每一个游戏由4个从1-9的数字和3个四则运算符组成,保证四则运算符将数字两两隔开,不存在括号和其他字符,运算顺序按照四则运算顺序进行。其中加分用符号+表示,减法用符号-表示,乘法用小写字母x表示,除法用符号/表示。在游戏里除法为整除,例如2/3=0,3/2=4,4/2=2。

老师给了你n个游戏的解,请你编写程序验证每个游戏的结果是否为24。

输入格式

从标准输入读入数据。

第一行输入一个整数n,从第2行开始开始到第n+1行中,每一行包含一个长度为7的字符串,为上述的24点游戏,保证数据格式合法。

输出格式

从标准输入读入数据。

第一行输入一个整数n,从第2行开始到第n+1行中,每一行包含一个长度为7的字符串,为上诉的24点游戏,保证数据格式合法。

输出格式

输出到标准输出。

包含n行,对于每一个游戏,如果其结果为24则输出字符串yes,否则输出字符串No。

样例1输入

10
9+3+4×3
5+4×5×5
7-9-9+8
5×6/5×4
3+5+7+9
1×1+9-9
1×9-5/9
8/5+6×9
6×7-3×6
6×4+4/5

样例1输出

Yes
No
No
Yes
Yes
No
No
No
Yes
Yes

样例1解释

9+3+4×3=24

5+4×5×5=105

7-9-9+8=-3

5×6/5×4=24

3+5+7+9=24

1×1+9-9=1

1×9-5/9=9

8/5+6×9=55

6×7-3×6=24

6×4+4/5=24

子任务

代码

#include<stdio.h>
#include<iostream>
#include<stack>
using namespace std;
int main()
{
    int n;
    string s;
    scanf("%d",&n);
    while(n--)
    {
        stack<int>q;
        cin>>s;
        int an=1;
        for(int i=0; i<(int)s.size(); i++)
        {
            if(s[i]>='0'&&s[i]<='9')
            {
                //做加减法
                q.push(an*(s[i]-'0'));
            }
            else if(s[i]=='+'||s[i]=='-')
            {
                //存储加减法的符号
                if(s[i]=='-')
                    an=-1;
                else an=1;
            }
            else
            {
                //计算乘除法
                int a=q.top();
                q.pop();
                i++;
                int b=s[i]-'0';
                if(s[i-1]=='/')
                {
                    q.push(a/b);
                }
                else
                {
                    q.push(a*b);
                }
            }
        }
        int ans=0;
        while(!q.empty())
        {
            //取出栈的顶部就是最后的计算结果
            ans+=q.top();
            q.pop();
        }
        if(ans==24)
            printf("Yes\n");
        else printf("No\n");
    }
    return 0;
}
posted @ 2021-02-26 09:44  张吱吱  阅读(333)  评论(0编辑  收藏  举报