试题编号: | 201903-2 |
试题名称: | 二十四点 |
时间限制: | 1.0s |
内存限制: | 512.0MB |
问题描述: | |
看到这个题目的时候,想着直接暴力就可以解决
再看,好像有64种情况,瞬间放弃
再考虑一步一步运算
但是乘除是先运行,而加减后运行,这就带来了很多麻烦
比如先是减,后面的是乘法,就必须先乘了之后,再和前面的数相减
最后,想到只有分2次计算
第一次就先计算式子中所有的乘除项
第二次再计算加减项
当计算了乘除后,结果放在后面的数的位置,之前的符号改为前面的符号,就可以避免结果的不一致
最后判断结果是否为24即可
#include<iostream>
using namespace std;
int main()
{
char a[10];
int b[10];
int n, k = 0;
cin >> n;
while (n--)
{
cin >> a;
int i;
for (i = 0; i < 7; i += 2)
{
b[i] = a[i] - '0';
}
for (i = 1; i < 7; i += 2)//计算乘除
{
if (a[i] == 'x')
{
b[i + 1] = b[i - 1] * b[i + 1];//B位置保存A*B
if (i == 1)//符号用上一个两个数之间的符号替换,结果就不会改变
a[i] = '+';
else
a[i] = a[i - 2];
b[i - 1] = 0;//A的位置置为0
}
else if (a[i] == '/')
{
b[i + 1] = b[i - 1] / b[i + 1];
if (i == 1)
a[i] = '+';
else
a[i] = a[i - 2];
b[i - 1] = 0;
}
}
for (i = 1; i < 7; i += 2)//再计算一遍加减
{
if (a[i] == '+')
b[0] += b[i + 1];
else if (a[i] == '-')
b[0] -= b[i + 1];
}
if (b[0] == 24)//判断最后的结果是否为24
cout << "Yes" << endl;
else
cout << "No" << endl;
}
return 0;
}