CSP 201903-2

在这里插入图片描述在这里插入图片描述

#include <iostream>
#include <cstdio>
#include <stack>
using namespace std;
int priority(char op){
    return op=='+'||op=='-'?0:1;
}
int compareOp(char op1,char op2){
    return priority(op1)-priority(op2);
}
int deal(int a,int b,char op){
    int r;
    switch(op){
        case '+':r=a+b;break;
        case '-':r=a-b;break;
        case 'x':r=a*b;break;
        case '/':r=a/b;break;
    }
    //cout<<"计算"<<a<<op<<b<<"="<<r<<endl;
    return r;
}
int calc(int num[],char op[]){
    stack<int> datas;
    stack<char> ops;
    datas.push(num[0]);
    ops.push(op[0]);
    datas.push(num[1]);
    if(compareOp(op[1],ops.top())>0){
        int n=datas.top();
        datas.pop();
        datas.push(deal(n,num[2],op[1]));
    }else{
        int n1=datas.top();
        datas.pop();
        int n2=datas.top();
        datas.pop();
        char opv=ops.top();
        ops.pop();
        datas.push(deal(n2,n1,opv));
        ops.push(op[1]);
        datas.push(num[2]);
    }
    if(compareOp(op[2],ops.top())>0){
        int n=datas.top();
        datas.pop();
        datas.push(deal(n,num[3],op[2]));
    }else{
        int n1=datas.top();
        datas.pop();
        int n2=datas.top();
        datas.pop();
        char opv=ops.top();
        ops.pop();
        datas.push(deal(n2,n1,opv));
        ops.push(op[2]);
        datas.push(num[3]);
    }
    int n1=datas.top();
    datas.pop();
    int n2=datas.top();
    datas.pop();
    char opv=ops.top();
    ops.pop();
    return deal(n2,n1,opv);
}
int main()
{
    int N;
    char op[3];
    int num[4];
    //freopen("d:\\a.txt","r",stdin);
    cin>>N;
    for(int i=0;i<N;i++){
        cin>>num[0]>>op[0]>>num[1]>>op[1]>>num[2]>>op[2]>>num[3];
        int r=calc(num,op);
        //cout<<num[0]<<op[0]<<num[1]<<op[1]<<num[2]<<op[2]<<num[3]<<"="<<r<<endl;
        if(r==24)cout<<"Yes"<<endl;
        else cout<<"No"<<endl;
    }
    return 0;
}

使用循环的写法:

#include <bits/stdc++.h>
using namespace std;
int priority(char op){
    return op=='+'||op=='-'?0:1;
}
int compareOp(char op1,char op2){
    return priority(op1)-priority(op2);
}
int deal(int a,int b,char op){
    int r;
    switch(op){
        case '+':r=a+b;break;
        case '-':r=a-b;break;
        case 'x':r=a*b;break;
        case '/':r=a/b;break;
    }
    return r;
}
int calc(int num[],char op[]){
    vector<int> datas;
    vector<char> ops;
    int n=0;
    while(n<3){
        if(datas.empty()){
            datas.push_back(num[n]);
            ops.push_back(op[n]);
            datas.push_back(num[n+1]);
        }
        else{
            if(compareOp(op[n],ops.back())>0){
                int n1=datas.back();
                datas.pop_back();
                datas.push_back(deal(n1,num[n+1],op[n]));
            }
            else{
                int n1=datas.back();
                datas.pop_back();
                int n2=datas.back();
                datas.pop_back();
                char opv=ops.back();
                ops.pop_back();
                datas.push_back(deal(n2,n1,opv));
                ops.push_back(op[n]);
                datas.push_back(num[n+1]);
            }
        }
        n++;
    }
    int n1=datas.back();datas.pop_back();
    int n2=datas.back();datas.pop_back();
    char opv=ops.back();ops.pop_back();
    return deal(n2,n1,opv);
}
int main()
{
    int N;
    char op[3];
    int num[4];
    //freopen("d:\\csp\\201903-1-1.txt","r",stdin);
    cin>>N;
    for(int i=0;i<N;i++){
        cin>>num[0]>>op[0]>>num[1]>>op[1]>>num[2]>>op[2]>>num[3];
        int r=calc(num,op);
        if(r==24)cout<<"Yes"<<endl;
        else cout<<"No"<<endl;
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值