首页 > 其他 > 详细

第十六次 ccf 201903-2 二十四点

时间:2019-03-24 16:57:52      阅读:705      评论:0      收藏:0      [点我收藏+]

  这道题只有7个字符,数字只有一位不算太难

  先算乘除,后算加减,考试的时候就是这样做的,用stack完美解决

  但如果加大难度....

  1)  数字允许有多位比如  1314-521*233

  2) 再比如如果有括号呢   -1-(1-(-9))

  让我们按照函数化的思想逐渐完善我们的代码

 

  (1) 7个字符版本

  

#include <iostream>
#include <algorithm>
#include <stack>
using namespace std;
int get_ans (string str) {
    stack <int> s;
    int flag=1;
    for (int i=0;i<str.size();i++) {
        if (str[i]>=0&&str[i]<=9) s.push( flag*(str[i]-0));
        else if (str[i]==- || str[i]==+)  {
            if (str[i]==-) flag=-1;
            else             flag=1;
        }
#include <iostream>
#include <algorithm>
#include <stack>
using namespace std;

int get_num(string str,int &k) { 
    // 从k开始一直读所有的数字字符
    int ans=0;
    for (;k<str.size();k++) {
        if (str[k]>=0 && str[k]<=9)
            ans=ans*10+str[k]-0;
        else break;
    }
    k--; // i 此时指向最后一个数字的位置 
    return ans;
}

int get_ans (string str) {
    stack <int> s;
    int flag=1;
    for (int i=0;i<str.size();i++) {
        if (str[i]>=0&&str[i]<=9)  {
            int num=get_num(str,i);
            s.push(flag*num);
        }
        else if (str[i]==- || str[i]==+)  {
            if (str[i]==-) flag=-1;
            else             flag=1;
        }
        else {
            char ch=str[i];
            int x1=s.top(); s.pop();
            i++;
            int x2=get_num(str,i);
            if (ch==/)  s.push(x1/x2);
            else          s.push(x1*x2);
        }
    }
    int sum=0;
    while (!s.empty()) {
        sum+=s.top();
        s.pop();
    }
    return sum;
}

int main ()
{
    int T; cin>>T;
    while (T--) {
        string str; cin>>str;
        cout<<get_ans(str)<<endl;
    }
    return 0;
}

 

int x1=s.top(); s.pop();
            i++; // importment !!
            int x2=str[i]-0;
            if (str[i-1]==/)  s.push(x1/x2);
            else               s.push(x1*x2);
        }
    }
    int sum=0;
    while (!s.empty()) {
        sum+=s.top();
        s.pop();
    }
    return sum;
}
int main ()
{
    int T; cin>>T;
    while (T--) {
        string str; cin>>str;
        cout<<get_ans(str)<<endl;
    }
    return 0;
}

允许输入连续的数字233, 我们只需要加一个输入接口

 

第十六次 ccf 201903-2 二十四点

原文:https://www.cnblogs.com/xidian-mao/p/10588813.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!