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;
}