CCF-CSP 201903-2二十四点 三种方法 满分题解 结尾附惊天方法
题目链接:CCF-CSP 201903-2二十四点
方法一思路:
1.通读题意,发现该表达式仅由4个数字和3个四则运算组成,即长度为7。
2.利用栈”先进先出”的特性,设置一个数字栈,将数字保存在栈里。
3.利用一些基本的数学知识进行转化:将减法转换成加法。
4.直接计算乘法和除法,将所得结果压入栈中。
5.细节:在x和/后接的一个数字可以直接用(运算优先性),但是符号前面的一个数字需要通过栈来给出。==举例:==5x6/5x4:在计算/时,不能直接用6/5来进行计算,必须用栈顶元素30来进行计算。
方法一代码如下:(结尾附样例)
#include <bits/stdc++.h>
using namespace std;
bool Jude(char a[])
{
bool flag=false;
stack<int>p;//数字栈
int i=0;
while(i<7)//观察可得,每个表达式的长度都为7
{
if(a[i]>='1'&&a[i]<='9')
{
p.push(a[i]-'0');
i++;//将数字进栈
}
else if(a[i]=='+')
{
i++;//跳过
}
else if(a[i]=='-')
{
//将-转换成+
p.push((a[i+1]-'0')*(-1));//将数字进栈
i=i+2;//由于后一数字已经操作,跳过此数字
}
else if(a[i]=='x')
{
int sum=0;
int temp=p.top();
p.pop();
sum=(a[i+1]-'0')*temp;//处理乘法
i=i+2;//连同后一数字一起处理
p.push(sum);//将乘法所得结果进栈
}
else if(a[i]=='/')
{
int sum=0;
int temp=p.top();
p.pop();
sum=(temp/(a[i+1]-'0'));//处理除法
i=i+2;//连同后一数字一起处理
p.push(sum);//将除法所得结果进栈
}
}
int sum=0;
while(p.empty()==false)//通过栈p来判断
{
sum+=p.top();
p.pop();
}
if(sum==24)flag=true;
else flag=false;
return flag;
}
int main()
{
int n;cin>>n;
for(int i=1;i<=n;i++)
{
char a[8];
cin>>a;
if(Jude(a))
{
cout<<"Yes"<<endl;
}
else
{
cout<<"No"<<endl;
}
}
return 0;
}
//样例1输入
//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
方法二思路:
1.通读题意,发现该表达式仅由4个数字和3个四则运算组成,即长度为7。
2.可以判断运算符在字符串中的位置,也可以判断出数字在字符串中的位置。
3.利用数字和字符的位置直接进行运算。
方法二代码如下:(结尾附样例)
#include <bits/stdc++.h>
using namespace std;
int judge(char s[])
{
int a[4], i, j;
char op[3];
//从输入取出数和运算符
for(i = 0; i < 4; i++)
a[i] = s[i * 2] - '0';
for(i = 0; i < 3; i++)
op[i] = s[i * 2 + 1];
int k = 3; /* 总共有三个运算符即计算3次 */
// 先计算乘和除
for(i = 0; i < k; i++)
if(op[i] == 'x' || op[i] == '/') {
if(op[i] == 'x') a[i] = a[i] * a[i + 1];
else a[i] = a[i] / a[i + 1];
for(j = i + 1; j < k; j++) {
op[j - 1] = op[j];
a[j] = a[j + 1];
}
k--, i--;
}
//再计算加和减
int ans = a[0];
for(i = 0; i < k; i++)
if(op[i] == '+') {
ans = a[i] + a[i + 1];
a[i + 1] = ans;
} else {
ans = a[i] - a[i + 1];
a[i + 1] = ans;
}
return ans == 24;
}
int main(void)
{
int n;cin>>n;
char s[8];
while(n--) {
cin>>s;
if(judge(s))
{
cout<<"Yes"<<endl;
}
else cout<<"No"<<endl;
}
return 0;
}
//样例1输入
//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
方法三思路:
1.对表达式进行预处理,将’x’转换成’*’,’/‘转换成’//’。
利用Python语言中的eval()函数对表达式进行求值。
方法三代码如下:(结尾附样例)
n = int(input())
for i in range(n):
s = input().replace('x', '*').replace('/', '//')
print("Yes" if eval(s) == 24 else "No")
//样例1输入
//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
谁能想到Python用四行就能解决CCF-CSP第二题呢!!!