题意:求化学反应方程式的第一种生成物的相对分子质量,难点在于细节处理,还好括号是一层,数字是1-9,降低了难度。
解法:map+模拟。
#include<bits/stdc++.h>
using namespace std;
int main()
{
map<string,int>pq;
pq["N"]=14;
pq["C"]=12;
pq["O"]=16;
pq["Cl"]=35;
pq["S"]=32;
pq["H"]=2;
pq["Al"]=27;
pq["Ca"]=40;
pq["Zn"]=65;
pq["Na"]=23;
int T;
cin>>T;
while(T--)
{
string str,s;
cin>>str;
int op,len,su=0,sum=0,n=1;
op=str.find('=');
len=str.size();
for(int i=op+1;;i++)
{
if(str[i]=='+'||i==len)
break;
string s;
if(isalpha(str[i]))
{
s+=str[i];
if(i+1<len&&islower(str[i+1]))
{
s+=str[i+1];
if(i+2<len&&isdigit(str[i+2]))
{
su+=pq[s]*(str[i+2]-'0');
sum+=su;
su=0;
i+=2;
}
else
{
su+=pq[s];
sum+=su;
su=0;
i++;
}
}
else if(i+1<len&&isdigit(str[i+1]))
{
su+=pq[s]*(str[i+1]-'0');
sum+=su;
su=0;
i++;
}
else
{
su+=pq[s];
sum+=su;
su=0;
}
}
else if(str[i]=='(')
{
i++;
while(str[i]!=')')
{
s+=str[i];
if(i+1<len&&islower(str[i+1]))
{
s+=str[i+1];
if(i+2<len&&isdigit(str[i+2]))
{
su+=pq[s]*(str[i+2]-'0');
i+=2;
}
else
{
su+=pq[s];
i++;
}
}
else if(i<len&&isdigit(str[i]))
{
su+=pq[s]*(str[i+1]-'0');
i++;
}
else
{
su+=pq[s];
i++;
}
s.clear();
}
i++;
sum+=su*(str[i]-'0');
}
else
n=str[i]-'0';
}
printf("%04d\n",n*sum);
}
return 0;
}