题解 P4711 【「化学」相对分子质量】

· · 题解

一道纯模拟,不如让蒟蒻来一篇题解

非常的无脑,把所有元素用变量存一下

然后就可以用 m() 函数找出对应元素的质量

然后就无脑模拟就OK啦~

如果诸位大佬有更好的思路,欢迎评论!

#include <stdio.h>
#include <string.h>
#include <iostream>
using namespace std;

float H = 1 ;
float C = 12;
float N = 14;
float O = 16;
float F = 19;
float Na= 23;
float Mg= 24;
float Al= 27;
float Si= 28;
float P = 31;
float S = 32;
float Cl= 35.5;
float K = 39;
float Ca= 40;
float Mn= 55;
float Fe= 56;
float Cu= 64;
float Zn= 65;
float Ag= 108;
float I = 127;
float Ba= 137;
float Hf= 178.5;
float Pt= 195;
float Au= 197;
float Hg= 201;
float HO= 18;
float ans   ;

string M;
int len,flag;

float m(int i)
{
    if(M[i] == 'H'){
        if(M[i+1] == 'f'){flag = 1;return Hf;}
        if(M[i+1] == 'g'){flag = 1;return Hg;}
        else                      {return H ;}
    } 
    if(M[i] == 'N'){
        if(M[i+1] == 'a'){flag = 1;return Na;}
        else                      {return N ;}
    }
    if(M[i] == 'A'){
        if(M[i+1] == 'l'){flag = 1;return Al;}
        if(M[i+1] == 'u'){flag = 1;return Au;}
        if(M[i+1] == 'g'){flag = 1;return Ag;}
    }
    if(M[i] == 'I')               {return I ;}
    if(M[i] == 'O')               {return O ;}
    if(M[i] == 'F'){
        if(M[i+1] == 'e'){flag = 1;return Fe;}
        else                      {return F ;}
    }
    if(M[i] == 'M'){
        if(M[i+1] == 'g'){flag = 1;return Mg;}
        if(M[i+1] == 'n'){flag = 1;return Mn;}
    }
    if(M[i] == 'S'){
        if(M[i+1] == 'i'){flag = 1;return Si;}
        else                      {return S ;}
    }
    if(M[i] == 'C'){
        if(M[i+1] == 'l'){flag = 1;return Cl;}
        if(M[i+1] == 'a'){flag = 1;return Ca;}
        if(M[i+1] == 'u'){flag = 1;return Cu;}
        else                      {return C ;}
    }
    if(M[i] == 'P'){
        if(M[i+1] == 't'){flag = 1;return Pt;}
        else                      {return P ;}
    }   
    if(M[i] == 'B')      {flag = 1;return Ba;}
    if(M[i] == 'Z')      {flag = 1;return Zn;}
    if(M[i] == 'K')               {return K ;}
    return -1;
}

int main()
{
    cin >> M;
    len = M.size();
    for(int i=0;i<len;i++)
    {
        if(M[i] == '_'){
            int num = M[i+2]-48;
            if(m(i-1) == -1)ans += (num-1)*m(i-2);
            else            ans += (num-1)*m(i-1);
            flag = 0;
            i += 3;
        }
        else if(M[i] == '('){
            float _ans; int num;
            while(M[++i] !=')'){
                if(M[i] == '_'){
                    int num = M[i+2]-48;
                    if(m(i-1) == -1)_ans += (num-1)*m(i-2);
                    else            _ans += (num-1)*m(i-1);
                    flag = 0;
                    i += 3;
                }
                else{
                    _ans += m(i);
                    if(flag == 1)   i++,flag=0;
                }
            }
            if(M[++i] == '_'){
                i+=2;
                int num = M[i]-48;
                while(1<M[++i]-48 && M[i]-48<=9){
                    num *= 10;
                    num += M[i]-48;
                }
                ans += _ans*(num);
            }
        }
        else if(M[i] == '~'){
            int num = 1;
            if(1<=M[++i]-48 && M[i]-48<=9){
                num = M[i]-48;
                while(1<=M[++i]-48 && M[i]-48<=9){
                    num *= 10;
                    num += M[i++]-48;
                }
            }
            ans += num*HO;
            i += 6;
        }
        else{
            ans += m(i);
            if(flag == 1)   i++,flag=0;
        }
    }
    cout << ans << endl;
    return 0;
}