codevs 计算器的改良

#include<iostream>
#include<cctype> 
#include<vector>
#include<cstdio>
using namespace std;

// 
int get_num(string s)
{
    int sum=0;
    for(int i=0;i<s.length();i++)
    {
        int k=s[i]-'0';
        sum=sum*10+k;
    }
    //cout<<sum<<endl;
    return sum;
}

int main()
{
    string s="6a-5+1=2-2a";
    cin>>s;
    vector<string> s0;
    //第一步,实现分离 
    char ch;
    int loc=0;
    for(int i=1;i<s.length();i++)
    {
        if(s[i]=='=')
        {
            s0.push_back(s.substr(loc,i-loc));
            s0.push_back("=");
            loc=i+1;
        }
        else if(s[i]=='+'||s[i]=='-')
        {
            string tmp=s.substr(loc,i-loc);
            s0.push_back(tmp);
            loc=i;
        }
    } 
    s0.push_back(s.substr(loc,s.length()-loc));
    //for(int i=0;i<s0.size();i++)
    //    cout<<s0[i]<<endl;
    //分离后的计算
    int x=0,c=0;
    int f=1;
    for(int i=0;i<s0.size();i++){
        if(s0[i]=="=")
        {
            f=-1;
            continue;
        }
        int kt=s0[i].length();
        if(isalpha(s0[i][kt-1])){
            ch=s0[i][kt-1];
            if(s0[i][0]=='-')
                x-=f*get_num(s0[i].substr(1,kt-2));
            else if(s0[i][0]=='+')
                x+=f*get_num(s0[i].substr(1,kt-2));
            else x+=f*get_num(s0[i].substr(0,kt-1));
        }    
        else
        {
            if(s0[i][0]=='-')
                c+=f*get_num(s0[i].substr(1,kt));
            else if(s0[i][0]=='+')
                c-=f*get_num(s0[i].substr(1,kt));
            else c-=f*get_num(s0[i].substr(0,kt));                
        }
    }
    //cout<<x<<endl;
    //cout<<c<<endl;
    printf("%c=%.3f",ch,c*1.0/x);
    return 0;
}

一道很简单的题目,但是花了超级多的时间。

http://codevs.cn/problem/1015/

情况很多要依次处理,我是先把他们拆开打散,然后做相应的处理。

 主要用到了C++ STL 中的string数据结构类型

猜你喜欢

转载自www.cnblogs.com/hxh88/p/9249566.html