luogu4711 「化学」相对分子质量

http://www.elijahqi.win/archives/3808
恶心模拟

#include<bits/stdc++.h>
using namespace std;
map<string,double> MM;
inline void init(){
    string A="H";MM[A]=1;
    A="C";MM[A]=12;
    A="N";MM[A]=14;
    A="O";MM[A]=16;
    A="F";MM[A]=19;
    A="Na";MM[A]=23;
    A="Mg";MM[A]=24;
    A="Al";MM[A]=27;
    A="Si";MM[A]=28;
    A="P";MM[A]=31;
    A="S";MM[A]=32;
    A="Cl";MM[A]=35.5;
    A="K";MM[A]=39;
    A="Ca";MM[A]=40;
    A="Mn";MM[A]=55;
    A="Fe";MM[A]=56;
    A="Cu";MM[A]=64;
    A="Zn";MM[A]=65;
    A="Ag";MM[A]=108;
    A="I";MM[A]=127;
    A="Ba";MM[A]=137;
    A="Hf";MM[A]=178.5;
    A="Pt";MM[A]=195;
    A="Au";MM[A]=197;
    A="Hg";MM[A]=201;
}
char s[110];int x,n;double ans;char s1[1];
inline double calc(){
    ++x;double res=0;
    while(s[x]!=')'){double tmp=0,nm=0;
        if (s[x+1]>='a'&&s[x+1]<='z'){
            s1[0]=s[x];
            string aa=s1;s1[0]=s[x+1];
            string bb=s1;aa=aa+bb;
            tmp=MM[aa];x+=2;
        }else{
            s1[0]=s[x];
            string aa=s1;
            tmp=MM[aa];++x;
        }
        if (s[x]=='_'){
            while(s[x]<'0'||s[x]>'9') ++x;
            while(s[x]<='9'&&s[x]>='0') nm=nm*10+s[x]-'0',++x;
        }else nm=1;res+=tmp*nm;
        if (s[x]=='}') ++x;
    }++x;return res;
}

int main(){
//  freopen("2.in","r",stdin);
    scanf("%s",s+1);init();n=strlen(s+1);bool flag=0;
    for (x=1;x<=n;){double tmp=0,nm=0;
        if (s[x]=='(') tmp=calc();
        else{
            if (s[x+1]>='a'&&s[x+1]<='z'){
                s1[0]=s[x];
                string aa=s1;s1[0]=s[x+1];
                string bb=s1;aa=aa+bb;
                tmp=MM[aa];x+=2;
            }else{
                s1[0]=s[x];
                string aa=s1;
                tmp=MM[aa];++x;
            }
        }
        if (s[x]=='_'){
            while(s[x]<'0'||s[x]>'9') ++x;
            while(s[x]<='9'&&s[x]>='0') nm=nm*10+s[x]-'0',++x;
        }else nm=1;ans+=tmp*nm;
        if (s[x]=='}') ++x;
        if (s[x]=='~') {flag=1;++x;break;}
    }double nm=0;
    for (;x<=n;){
        if (s[x]<='9'&&s[x]>='0'){
            while(s[x]<'0'||s[x]>'9') ++x;
            while(s[x]<='9'&&s[x]>='0') nm=nm*10+s[x]-'0',++x;break;
        }else {nm=1;break;}

    }if (flag) ans+=nm*18;
    printf("%f\n",ans);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值