题解 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;
}