【CCF计算机资格认证】201912-3化学方程式C++

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

#include "iostream"

#include "string"

#include "map"

using namespace std;

bool check(map<string, int> num)
{
    string elem;
    map<string, int>::iterator iter;
    for (iter = num.begin(); iter != num.end(); iter++)
    {
        elem = iter->first;
        if (elem[0] == '(' && num[elem] != 0)
        {
            return false;
        }
    }
    return true;
}

map<string, int> clean(map<string, int> num)
{
    string e, elem;
    int bback, back, inner_num;
    map<string, int>::iterator iter;
    for (iter = num.begin(); iter != num.end(); iter++)
    {
        elem = iter->first;
        if (elem[0] == '(' && num[elem] != 0)
        {
            bback = num[elem];
            // 拆分(NO3)
            for (int i = 1; i < elem.size() - 1; i++)
            {
                e = elem[i];

                if (elem[i] == '(')
                {
                    inner_num = 1;
                    while (inner_num)
                    {
                        if (elem[i + 1] == ')')
                        {
                            inner_num--;
                        }
                        else if (elem[i + 1] == '(')
                        {
                            inner_num++;
                        }
                        i++;
                        e += elem[i];
                    }
                }

                if (elem[i + 1] >= 'a' && elem[i + 1] <= 'z')
                {
                    i++;
                    e += elem[i];
                }

                // 系数
                if (elem[i + 1] >= '1' && elem[i + 1] <= '9')
                {
                    i++;
                    back = elem[i] - '0';
                    while (elem[i + 1] >= '0' && elem[i + 1] <= '9')
                    {
                        i++;
                        back = back * 10 + elem[i] - '0';
                    }                }
                else
                {
                    back = 1;
                }
                // 计分
                if (!num.count(e))
                {
                    num[e] = 0;
                }
                num[e] += back * bback;
            }
            num[elem] = 0;
        }
    }
    return num;
}

char func(string s)
{
    map<string, int> num;
    string elem = "";
    int prior = 1;
    int back = 1;
    int bback;
    int inner_num = 0;

    bool left = true;

    // CaCl2+2AgNO3=Ca(NO3)2+2AgCl
    // 4Au+8NaCN+2H2O+O2=4Na(Au(CN)2)+4NaOH
    for (int j = 0; j < s.size(); j++)
    {
        if ((s[j] >= 'A' && s[j] <= 'Z') || s[j] == '(') // 元素开头字母
        {
            elem = s[j];

            if (s[j] == '(')
            {
                inner_num = 1;
                while (inner_num)
                {
                    if (s[j + 1] == ')')
                    {
                        inner_num--;
                    }
                    else if (s[j + 1] == '(')
                    {
                        inner_num++;
                    }
                    j++;
                    elem += s[j];
                }
            }

            if ((s[j + 1] >= 'a' && s[j + 1] <= 'z'))
            {
                j++;
                elem += s[j];
            }

            // cout << "-" << elem << endl;

            if (s[j + 1] >= '1' && s[j + 1] <= '9') // 系数
            {
                j++;
                back = s[j] - '0';
                while (s[j + 1] >= '0' && s[j + 1] <= '9')
                {
                    j++;
                    back = back * 10 + s[j] - '0';
                }
            }
            else
            {
                back = 1;
            }
            // 计分
            if (!num.count(elem))
            {

                num[elem] = 0;
            }

            if (left)
            {
                num[elem] += prior * back;
            }
            else
            {
                num[elem] -= prior * back;
            }
        }

        else if (s[j] >= '1' && s[j] <= '9') // 系数
        {

            prior = s[j] - '0';
            while (s[j + 1] >= '0' && s[j + 1] <= '9')
            {
                j++;
                prior = prior * 10 + s[j] - '0';
            }
        }

        else if (s[j] == '=') // 区分方程式左右
        {
            prior = 1;
            back = 1;
            left = false;
        }

        else
        {
            prior = 1;
            back = 1;
        }
    }

    while (!check(num))
    {
        num = clean(num);
    }

    map<string, int>::iterator iter;
    for (iter = num.begin(); iter != num.end(); iter++)
    {
        elem = iter->first;
        if (num[elem] != 0)
        {
            return 'N';
        }
    }
    return 'Y';
}

int main(int argc, char const *argv[])
{
    string s;
    int n;

    cin >> n;

    for (int i = 0; i < n; i++)
    {
        cin >> s;
        cout << func(s) << endl;
    }

    return 0;
}
发布了103 篇原创文章 · 获赞 128 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_44936889/article/details/104084499