您当前的位置: 首页 >  c++

小天才才

暂无认证

  • 6浏览

    0关注

    168博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

CCF小白刷题之路---201912-3 化学方程式(C/C++ 100分)

小天才才 发布时间:2021-01-26 18:45:23 ,浏览量:6

一、题目描述

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

二、题目讲解

下面我们针对每个测试点进行讲解,应该怎么处理各种情况

(1)只包含大写字母和等号

这一步我们只需要统计好每个大写字母的个数即可,但是这里要注意可能会出现重复的大写字母,例如:AAAA=AAAB

(2)加入小写字母和加号

这一步我们要针对每个化学式进行处理,同时我们要注意有的元素是同时包含了大小写字母,在处理的时候要把这些合在一起构成一个元素。

(3)加入数字

这一步就要判断数字的情况了,数字如果位于化学式的前面,则代表这个化学式的系数,意味着里面每一个元素都要乘以这个系数;如果数字位于这个元素的后面,则只需要这个元素乘以这个数字就行;如果数字位于一对括号的后面,则需要把这个括号里面的所有元素都乘以这个系数。

(4)加入括号

这一步我们可以进行倒序遍历,去挨个计算每一个括号内的元素,这里要注意的是括号嵌套的情况,具体的实现方法在下面的代码都有详细注释,方便大家理解。

三、代码实现
#include
#include
#include
#include
#include
using namespace std;
//结构体,便于存储每一个化学式中的每一个元素
struct Elem{
    string name;//元素名称
    int num;//元素个数
    //构造函数,便于直接赋值,注意最后没有分号
    Elem(string n1,int n2):name(n1),num(n2){}
};
//便于获取系数和化学式下标
int number(string &str,int &i)
{
    int num = 0;
    while(isdigit(str[i]))
    {
        num = num * 10 + str[i] - '0';
        i++;
    }
    return num;
}
//分别处理化学方程式等号两边
void calculate(string &str,map &mp)
{
    stringstream ss(str);
    string item;
    //以加号为标志分割方程式,处理每一个化学式
    while(getline(ss,item,'+'))
    {
        int factor = 1;//化学式初始系数,默认为1
        int i = 0;
        vector elem;
        //如果化学式前面的系数不为0,则进行计算,赋值给factor
        if(isdigit(item[i])) factor = number(item,i);
        //开始处理每个化学式
        while(isecond) return false;
    }
    return true;
}

int main()
{
    int n;
    cin>>n;
    string str,str_left,str_right;
    while(n--)
    {
        cin>>str;
        stringstream ss(str);
        getline(ss,str_left,'=');//赋值化学方程式等号左边
        getline(ss,str_right);//赋值化学方程式等号右边
        map left,right;
        calculate(str_left,left);//处理化学方程式的左半部分
        calculate(str_right,right);//处理化学方程式的右半部分
        if(judge(left,right)) cout            
关注
打赏
1658396332
查看更多评论
0.0360s