CCF 201912-3 化学方程式(100分)

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

改了两天拿的满分
在这里插入图片描述
大概思路是先把等号两边分开,然后提取出所有项和系数,存进vector中,最后计算所有元素的值,并比较。
遇到的错误:判断等号时遇到一个’(‘简单地从最后找‘)’,(AB)(ABAB)这种情况就会遇到错误,应该老老实实用栈判断相对应的’)’

#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
#include<map>
#include<vector>
using namespace std;
class hxfcs
{
public:
    void divide();
    void handle();
    void get_xiang();
    void get_yuansu(int type,int num,string str);
    void check();
    int str_to_num(string str);
    int find_pos(string str,int init);
    hxfcs(string s);
    int is_ping;//是否配平
    string fcs;
    string left_str;
    string right_str;
    vector<string> left_xiang,right_xiang;
    map<string,int> left_yuansu,right_yuansu;


};
hxfcs::hxfcs(string s)
{
    is_ping = 0;
    fcs = s;
    divide();//分成left和right
    handle();
    check();
}
void hxfcs::divide()
{
    //cout<<fcs<<endl;
    int divide_pos = fcs.find("=");
    left_str = fcs.substr(0,divide_pos);
    right_str = fcs.substr(divide_pos + 1,fcs.size() - 1 - divide_pos);
    //cout<<left_str<<endl;
    //cout<<right_str<<endl;
}
int hxfcs::find_pos(string str,int init)
{
    int num = 0;
    for(int i = init;i < str.size();i ++)
    {
        if(str[i] == '(')
            num ++;
        if(str[i] == ')')
        {
            num --;
            if(num == 0)
                return i;
        }
    }
}
int hxfcs::str_to_num(string str)
{
    int num = 0;
    for(int i = 0;i < str.size();i ++)
    {
        num += str[i] - '0';
        if(i != str.size() - 1)
            num *= 10;
    }

    return num;
}
void hxfcs::handle()
{
    get_xiang();
    //
    for(int i = 0;i < left_xiang.size();i ++)
    {
        string xiang = left_xiang[i];
        int num = 1;
        string num_str="";
        string xiang_without_num;
        if(xiang[0] > '9' || xiang[0] < '0')
        {
            num = 1;
            xiang_without_num = xiang;
        }
        else
        {
            for(int j = 0;j < xiang.size();j ++)
            {
                if(xiang[j]<='9' && xiang[j] >= '0')
                {
                    num_str.append(1,xiang[j]);
                }
                else
                    break;
            }
            num = str_to_num(num_str);
            xiang_without_num = xiang.substr(num_str.size(),xiang.size() - num_str.size());
        }

        //cout<<num<<" "<<xiang_without_num<<endl;

        //
        get_yuansu(0,num,xiang_without_num);
    }

    for(int i = 0;i < right_xiang.size();i ++)
    {
        string xiang = right_xiang[i];
        int num = 1;
        string num_str="";
        string xiang_without_num;
        if(xiang[0] > '9' || xiang[0] < '0')
        {
            num = 1;
            xiang_without_num = xiang;
        }
        else
        {
            for(int j = 0;j < xiang.size();j ++)
            {
                if(xiang[j]<='9' && xiang[j] >= '0')
                {
                    num_str.append(1,xiang[j]);
                }
                else
                    break;
            }
            num = str_to_num(num_str);
            xiang_without_num = xiang.substr(num_str.size(),xiang.size() - num_str.size());
        }

        //cout<<num<<" "<<xiang_without_num<<endl;

        //
        get_yuansu(1,num,xiang_without_num);
    }
}
void hxfcs::get_yuansu(int type,int num,string str)
{
    //cout<<num<<" "<<str<<endl;
    if(str[0] == '(')
    {
        int pos;
        int c = 1;
        string c_str = "";
        /*for(int i = str.size() - 1;i >=0 ;i --)
        {
            if(str[i] == ')')
            {
                pos = i;
                break;
            }
        }*/
        pos = find_pos(str,0);
        if(pos != str.size() - 1)
        {
            if(str[pos + 1] <= '9' && str[pos + 1] >= '0')
            {
                for(int i = pos + 1;i < str.size();i ++)
                {
                    if(str[i] <= '9' && str[i] >= '0')
                    {
                        c_str.append(1,str[i]);
                        if(i == str.size() - 1)
                        {
                            c = str_to_num(c_str);
                            get_yuansu(type,num*c,str.substr(1,pos - 1));
                            break;
                        }
                    }
                    else
                    {
                        c = str_to_num(c_str);
                        get_yuansu(type,num*c,str.substr(1,i - c_str.size() - 2));
                        get_yuansu(type,num,str.substr(i,str.size() - i));
                        break;
                    }

                }
            }
            else
            {
                get_yuansu(type,num,str.substr(1,pos - 1));
                get_yuansu(type,num,str.substr(pos + 1,str.size() - pos));
            }

        }
        else
        {
            get_yuansu(type,num,str.substr(1,str.size() - 2));
        }


    }
    else if(str[0] <= 'Z' && str[0] >= 'A')
    {
        string next_str = "";
        next_str.append(1,str[0]);
        string c_str = "";
        int c = 1;
        int right_pos = 0;
        int last = 1;
        for(int i = 1;i < str.size();i ++)
        {
            if(str[i] <= '9' && str[i] >= '0')
            {
                last = 0;
                for(int j = i;j < str.size();j ++)
                {
                    if(str[j] <= '9' && str[j] >= '0')
                    {
                        c_str.append(1,str[j]);
                        if(j == str.size() - 1)
                        {
                            right_pos = -1;
                            c = str_to_num(c_str);
                            break;
                        }
                    }
                    else
                    {
                        right_pos = j;
                        c = str_to_num(c_str);
                        break;
                    }
                }
                break;
            }
            else if(str[i] <= 'z' && str[i] >= 'a')
            {
                next_str.append(1,str[i]);
            }
            /*else if(str[i] <= 'Z' && str[i] >= 'A')
            {
                last = 0;
            }*/
            else
            {
                last = 0;
                right_pos = i;
                c = 1;
                break;
            }
        }
        if(last == 1)
        {
            if(type == 0)
            {
                if(left_yuansu.find(next_str) != left_yuansu.end())
                {
                    left_yuansu.find(next_str) -> second += num * c;
                }
                else
                {
                    left_yuansu.insert(pair<string,int>(next_str,num * c));
                }
            }
            else
            {
                if(right_yuansu.find(next_str) != right_yuansu.end())
                {
                    right_yuansu.find(next_str) -> second += num * c;
                }
                else
                {
                    right_yuansu.insert(pair<string,int>(next_str,num * c));
                }
            }
            //cout<<"+"<<c * num<<" "<<next_str<<" now left"<<left_yuansu.find(next_str) -> second<<" now right"<<right_yuansu.find(next_str) -> second<<endl;
        }
        else
        {
            get_yuansu(type,num * c,next_str);
            if(right_pos != -1)
                get_yuansu(type,num,str.substr(right_pos,str.size() - right_pos));
        }
    }
    else if(str[0] <= '9' && str[0] >= '0')
    {
        string c_str;
        int c = 0;
        int pos = -1;
        for(int i = 0;i < str.size();i ++)
        {
            if(str[i] <= '9' && str[i] >= '0')
            {
                c_str.append(1,str[i]);
            }
            else
            {
                c = str_to_num(c_str);
                string this_str;
                if(str[i] == '(')
                {
                    pos = find_pos(str,i);
                    get_yuansu(type,num * c,str.substr(i + 1,pos - i - 1));
                    break;
                }
                /*else if(str[i] <= 'Z' && str[i] >= 'A')
                {
                    this_str.append(1,str[i]);
                    for(int j = i + 1;j < str.size();j ++)
                    {

                    }
                }*/

            }
        }
    }
}
void hxfcs::get_xiang()
{
    int divide_pos;
    string t_left_str = left_str;
    string t_right_str = right_str;
    while(1)
    {
        divide_pos = t_left_str.find("+");
        if(divide_pos == -1)
        {
            left_xiang.push_back(t_left_str);
            break;
        }
        else
        {
            left_xiang.push_back(t_left_str.substr(0,divide_pos));
            t_left_str = t_left_str.substr(divide_pos + 1,t_left_str.size() - 1 - divide_pos);
        }
    }
    while(1)
    {
        divide_pos = t_right_str.find("+");
        if(divide_pos == -1)
        {
            right_xiang.push_back(t_right_str);
            break;
        }
        else
        {
            right_xiang.push_back(t_right_str.substr(0,divide_pos));
            t_right_str = t_right_str.substr(divide_pos + 1,t_right_str.size() - 1 - divide_pos);
        }
    }
    //test
    /*
    cout<<"left:"<<endl;
    for(int i = 0;i < left_xiang.size();i ++)
        cout<<left_xiang[i]<<endl;
    cout<<"--------------"<<endl;
    cout<<"right:"<<endl;
    for(int i = 0;i < right_xiang.size();i ++)
        cout<<right_xiang[i]<<endl;
    cout<<"--------------"<<endl;*/
}
void hxfcs::check()
{
    int res = 1;
    map<string,int>::iterator it1,it2;
    for(it1 = left_yuansu.begin();it1 != left_yuansu.end();it1 ++)
    {
        //cout<<it1 -> first<<":"<<it1 -> second<<endl;
        it2 = right_yuansu.find(it1 ->first);
        if(it2 == right_yuansu.end() || it2 -> second != it1 ->second)
        {
            res = 0;
            break;
        }
    }
    for(it1 = right_yuansu.begin();it1 != right_yuansu.end();it1 ++)
    {
        //cout<<it1 -> first<<":"<<it1 -> second<<endl;
        it2 = left_yuansu.find(it1 ->first);
        if(it2 == left_yuansu.end() || it2 -> second != it1 ->second)
        {
            res = 0;
            break;
        }
    }


    if(res)
        is_ping = 1;
    else
        is_ping = 0;
}
int main()
{
    int n;
    cin>>n;
    for(int i = 0;i < n;i ++)
    {
        string str;
        cin>>str;
        hxfcs fcs(str);
        if(fcs.is_ping)
            cout<<'Y'<<endl;
        else
            cout<<'N'<<endl;
    }

    return 0;
}

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值