题目
问题描述
二十四点是一款著名的纸牌游戏,其游戏的目标是使用3个加减乘除运算使得4张纸牌上数字的运算结果为24.
定义每一个游戏由4个从1-9的数字和3个四则运算符组成,保证四则运算符将数字两两隔开,不存在括号和其他字符,运算顺序按照四则运算顺序进行。其中加法用符号+表示,减法用符号-表示,乘法用下写字母x表示,除法用符号/表示。在游戏里除法为整除,例如2 / 3 = 0, 3 / 2 = 1, 4 / 2 = 2。
老师给了你n个游戏的解,请你编写程序验证每个游戏的结果是否为24。
输入格式
从标准输入读入数据。
第一行输入一个整数n,从第2行开始到第n+1行中,每一行包含一个长度为7的字符串,为上述的24点游戏,保证数据格式合法。
输出格式
输出到标准输出。
包含n行,对于每一个游戏,如果其结果为24则输出字符串Yes,否则输出字符串No。
样例
输入:
10
9+3+4x3
5+4x5x5
7-9-9+8
5x6/5x4
3+5+7+9
1x1+9-9
1x9-5/9
8/5+6x9
6x7-3x6
6x4+4/5
输出:
Yes
No
No
Yes
Yes
No
No
No
Yes
Yes
解释:
9+3+4x3 = 24
5+4x5x5 = 105
7-9-9+8 = -3
5x6/5x4 = 24
3+5+7+9 = 24
1x1+9-9 = 1
1x9-5/9 = 9
8/5+6x9 = 55
6x7-3x6 = 24
6x4+4/5 = 24
子任务
分析
接收一个包含加减乘除运算的算式,然后对其进行计算。因为运算优先级不同,所以不能直接进行计算。我先计算第一优先级的,得到一个只包含加减的算式,然后再计算只包含加减的算式。
代码
/*
2019/12/28
csp试题2:二十四点
*/
#include <iostream>
using namespace std;
#include <string>
int main(){
//1.接收数据 并 声明一个标识
int n;
cin >>n;
bool flag[n];
for(int i=0; i<n; i++){
flag[i] = false;
}
//2.接收算式 并 计算
//因为乘除运算 与 加减运算 的优先级不同
//我们先算乘除,将算完乘除的算式保存到num1[]中
//然后再对num1[]中的算式计算加减法,得出最后结果
char opt[3] = "";
int index_o; //操作符的索引
int num[4];
int index_n; //数字的索引
char opt1[3] = "";
int index_o1;
int num1[4];
int index_n1;
for(int i=0; i<n; i++){
index_o = 0;
index_n = 0;
index_o1 = 0;
index_n1 = 0;
//2.1 接收算式
char c;
for(int j=0; j<7; j++){
cin >>c;
if(c - '0' >= 0 && c - '0' <= 9){
num[index_n] = int(c - '0');
index_n++;
}
else{
opt[index_o] = c;
index_o++;
}
}
//2.2 算乘除,将算完乘除的算式保存到num1[]中
num1[index_n1] = num[0];
index_n1++;
for(int j=0; j<index_o; j++){
if(opt[j] != 'x' && opt[j] != '/'){
opt1[index_o1] = opt[j];
index_o1++;
num1[index_n1] = num[j+1];
index_n1++;
}
else if(opt[j] == 'x'){
int temp = num1[index_n1-1] * num[j+1];
num1[index_n1-1] = temp;
}
else if(opt[j] == '/'){
int temp = num1[index_n1-1] / num[j+1];
num1[index_n1-1] = temp;
}
}
//2.3 对num1[]中的算式计算加减法,得出最后结果
int result = num1[0];
for(int j=0; j<index_o1; j++){
if(opt1[j] == '+'){
result = result + num1[j+1];
}
else if(opt1[j] == '-'){
result = result - num1[j+1];
}
}
if(result == 24){
flag[i] = true;
}
else{
flag[i] = false;
}
}
//3. 输出结果
for(int i=0; i<n; i++){
if(flag[i]){
cout <<"Yes"<<endl;
}
else{
cout <<"No"<<endl;
}
}
return 0;
}
总结
计算算式用栈应该会简单一些。我这种方法当不同的优先级变的多时,就不好算了。