CCF-CSP 201903-2二十四点 三种方法 满分题解 结尾附惊天方法

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第二题呢!!!

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值