【题解】P4711

· · 题解

作为一个合格的蒟蒻,我只会一个一个字符判断 QAQ。

思路:

  1. 输入字符串,把每个元素拆分出来,加上对应的分子质量。

  2. 如果有倍数就乘起来再加到 ans 里。

  3. 如果是原子团就先将括号里的所有元素求出后再乘倍数。

  4. 水合物就先把倍数存起来,再把水合物用一个变量存起来,最后把水合物乘倍数再加到 ans 里。

注意:水合物如果前面没有数字就默认为 1。

CODE:

#include<bits/stdc++.h>
using namespace std;
int main() {
    string s;
    double ans=0,nowc;//nowc 表示现在找到的元素
    double shui=0,shuim=0,sh=0;//数字,状态,倍数 
    double kuo=0,kuom=0,ku=0;//同上
    int zm=0;//表示元素长度
    cin>>s;//输入
    int i;
    for(i=0; i<s.length(); i++) {
        if(s[i]>='A'&&s[i]<='Z') {
        //如果是大写字母
            int ymy=0;//数字
         //漫长的打表
            if(s[i]=='A'&&s[i+1]=='l') {
                nowc=27;
                zm=2;
            }
            if(s[i]=='A'&&s[i+1]=='g') {
                nowc=108;
                zm=2;
            }
            if(s[i]=='A'&&s[i+1]=='u') {
                nowc=197;
                zm=2;
            }
            if(s[i]=='B'&&s[i+1]=='a') {
                nowc=137;
                zm=2;
            }
            if(s[i]=='C')   {
                nowc=12;
                zm=1;
            }
            if(s[i]=='C'&&s[i+1]=='a')  {
                nowc=40;
                zm=2;
            }
            if(s[i]=='C'&&s[i+1]=='l')  {
                nowc=35.5;
                zm=2;
            }
            if(s[i]=='C'&&s[i+1]=='u')  {
                nowc=64;
                zm=2;
            }
            if(s[i]=='F')   {
                nowc=19;
                zm=1;
            }
            if(s[i]=='F'&&s[i+1]=='e')  {
                nowc=56;
                zm=2;
            }
            if(s[i]=='H')   {
                nowc=1;
                zm=1;
            }
            if(s[i]=='H'&&s[i+1]=='f')  {
                nowc=178.5;
                zm=2;
            }
            if(s[i]=='H'&&s[i+1]=='g')  {
                nowc=201;
                zm=2;
            }
            if(s[i]=='I')   {
                nowc=127;
                zm=1;
            }
            if(s[i]=='K')   {
                nowc=39;
                zm=1;
            }
            if(s[i]=='M'&&s[i+1]=='g')  {
                nowc=24;
                zm=2;
            }
            if(s[i]=='M'&&s[i+1]=='n')  {
                nowc=55;
                zm=2;
            }
            if(s[i]=='N')   {
                nowc=14;
                zm=1;
            }
            if(s[i]=='N'&&s[i+1]=='a')  {
                nowc=23;
                zm=2;
            }
            if(s[i]=='O')   {
                nowc=16;
                zm=1;
            }
            if(s[i]=='P')   {
                nowc=31;
                zm=1;
            }
            if(s[i]=='P'&&s[i+1]=='t')  {
                nowc=195;
                zm=2;
            }
            if(s[i]=='S')   {
                nowc=32;
                zm=1;
            }
            if(s[i]=='S'&&s[i+1]=='i')  {
                nowc=28;
                zm=2;
            }
            if(s[i]=='Z'&&s[i+1]=='n')  {
                nowc=65;
                zm=2;
            }
            for(int j=i+zm+2; s[j]>='0'&&s[j]<='9'; j++)
                ymy=ymy*10+(s[j]-'0');//判断数量

            if(s[i+zm]=='_'&&!shuim&&!kuom)ans+=nowc*ymy;
            else if(s[i+zm]=='_'&&shuim)shui+=nowc*ymy;
            else if(shuim&&s[i+zm]=='_')shui+=nowc*ymy;
            else if(shuim)shui+=nowc;
            else if(kuom&&s[i+zm]=='_')kuo+=nowc*ymy;
            else if(kuom)kuo+=nowc;
            else ans+=nowc;
        } //判断要加到哪一类里

        else if(s[i]=='~') {//水合物
            shuim=1;
         //后面的元素全部加到水合物里最后统一乘
            for(int j=i+1; s[j]>='0'&&s[j]<='9'; j++)
                sh=sh*10+(s[j]-'0');//水合物的倍数
            if(sh==0)sh=1;//如果没有则默认为 1 
        } 

        else if(s[i]=='(')kuom=1;
        //左括号代表原子团出现,先存到特定变量里

        else if(s[i]==')') {
            for(int j=i+3; s[j]>='0'&&s[j]<='9'; j++)
                ku=ku*10+(s[j]-'0');//求倍数
                ans+=kuo*ku;//加到答案里
                kuom=0;
                ku=0;
        }
    }

ans+=shui*sh;//水合物乘起来加到 ans 
cout<<ans;
return 0;
}