首页 > 其他 > 详细

一道小模拟——洛谷 P4711 「化学」相对分子质量

时间:2019-11-13 00:22:37      阅读:107      评论:0      收藏:0      [点我收藏+]

传送门

这一行为了便于点击链接(否则会触发标题鼠标特效)

屠龙宝刀点击就送

这一行为了便于点击链接(否则会触发标题鼠标特效)

题意

给出分子式,求相对分子质量。

可能是水合物。

但括号(指的是一般化学意义上的括号)没有嵌套。

关于

一百行的模拟我都要想一年,我真的菜啊

但是练练细心和码风还是相当有意义的

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;

string his;
int water,ans;

inline int getint(int &x){//从x起是数 
    if(x==water&&his[x]=='H')return 1;
    if(x>=his.size())return 0;
//  cout<<"getint"<<x<<endl;
    int fuck=0;
    while(his[x]>='0'&&his[x]<='9'){
        fuck=fuck*10+his[x]-'0';
        x++;
    }
    return fuck;
}

inline int getm(char a){
//  cout<<"getm"<<a<<endl;
    if(a=='H')return 2;
    if(a=='C')return 24;
    if(a=='N')return 28;
    if(a=='O')return 32;
    if(a=='F')return 38;
    if(a=='P')return 62;
    if(a=='S')return 64;
    if(a=='K')return 78;
    if(a=='I')return 254;
}


inline int getm(char a,char b){
//  cout<<"getm"<<a<<b<<endl;
    if(a=='N'&&b=='a')return 46;
    if(a=='M'&&b=='g')return 48;
    if(a=='A'&&b=='l')return 54;
    if(a=='S'&&b=='i')return 56;
    if(a=='C'&&b=='l')return 71;
    if(a=='C'&&b=='a')return 80;
    if(a=='M'&&b=='n')return 110;
    if(a=='F'&&b=='e')return 112;
    if(a=='C'&&b=='u')return 128;
    if(a=='Z'&&b=='n')return 130;
    if(a=='A'&&b=='g')return 216;
    if(a=='B'&&b=='a')return 274;
    if(a=='H'&&b=='f')return 357;
    if(a=='P'&&b=='t')return 390;
    if(a=='A'&&b=='u')return 394;
    if(a=='H'&&b=='g')return 402;
}

inline int getlow(int &x){
    if(x==his.size())return 1;
//  cout<<"getlow"<<x<<endl;
    x+=2;
    int fuck=getint(x);
    x++;
    return fuck;
}

inline int calele(int &x){//Ca_{2}
    if(x==his.size())return 0;
//  cout<<"calele"<<x<<endl;
    int fuck;
    if(his[x+1]>='a'&&his[x+1]<='z'){
        fuck=getm(his[x],his[x+1]);
        x+=2;
    }
    else {
        fuck=getm(his[x]);
        x++;
    }
    if(his[x]=='_')fuck*=getlow(x);
    return fuck;
}

inline int calsec(int &x){//Ca_{2}或 (Ca_{2}K_{2})_{2}
    if(x==his.size())return 0;
//  cout<<"calsec"<<x<<endl;
    int fuck=0;
    if(his[x]=='('){
        x++;
        while(his[x]>='A'&&his[x]<='Z')fuck+=calele(x);
        x++;
        if(his[x]=='_')fuck*=getlow(x);
        return fuck;
    }
    else return calele(x);
}

int main(){
    cin>>his;
    water=his.find('~');
    if(water==-1)water=his.size();
    for(int i=0;i<water;)ans+=calsec(i);
    //第12个点WA笔记:H2O前面可能没有系数 
    water++;int fuck=ans+36*getint(water);
    if(fuck&1)printf("%d.5\n",fuck>>1);
    else printf("%d\n",fuck>>1);
}

一道小模拟——洛谷 P4711 「化学」相对分子质量

原文:https://www.cnblogs.com/Y15BeTa/p/11846146.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!