【题解】P4711
作为一个合格的蒟蒻,我只会一个一个字符判断 QAQ。
思路:
-
输入字符串,把每个元素拆分出来,加上对应的分子质量。
-
如果有倍数就乘起来再加到 ans 里。
-
如果是原子团就先将括号里的所有元素求出后再乘倍数。
-
水合物就先把倍数存起来,再把水合物用一个变量存起来,最后把水合物乘倍数再加到 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;
}