题目意思为求化学反应方程式等号后面一个物质的原子量,主要注意处理括号问题。
这里有个全局变量 j 要注意一下
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<queue>
#include<map>
#include<set>
#include<stack>
#include<vector>
#include<string.h>
using namespace std;
const int maxn=1e3+10;
const int INF=0x3f3f3f3f;
typedef long long ll;
char s[100];
int j;
int judge()
{
int res;
if(s[j]=='N')
{
if(s[j+1]=='a')
{
res=23;
j++;
}
else
res=14;
}
else if(s[j]=='C')
{
if(s[j+1]=='l')
{
j++;
res=35;
}
else if(s[j+1]=='a')
{
j++;
res=40;
}
else
res=12;
}
else if(s[j]=='O')
res=16;
else if(s[j]=='S')
res=32;
else if(s[j]=='H')
res=2;
else if(s[j]=='A'&&s[j+1]=='l')
{
res=27;
j++;
}
else if(s[j]=='Z'&&s[j+1]=='n')
{
res=65;
j++;
}
j++;
int bs=1;
if(s[j]>='0'&&s[j]<='9')
{
bs=0;
while(s[j]>='0'&&s[j]<='9')
{
bs=bs*10+(s[j]-'0');
j++;
}
}
return res*bs;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%s",s);
int len=strlen(s);
int f=0;
for(int i=0; i<len; i++)
{
if(s[i]=='=')
{
f=i+1;
break;
}
}
int ff=1;
j=f;
if(s[j]>='0'&&s[j]<='9')
{
ff=0;
while(s[j]>='0'&&s[j]<='9')
{
ff=ff*10+(s[j]-'0');
j++;
}
}
//printf("ff=%d\n",ff);
int sum=0,ys,kh,bs;
while(s[j]!='+'&&j<len)
{
if(s[j]>='A'&&s[j]<='Z')
{
sum+=judge();
}
else if(s[j]=='(')
{
//puts("______\n");
int kh=0;
j++;
while(s[j]>='A'&&s[j]<='Z')
{
kh+=judge();
}
if(s[j]==')')
{
j++;
bs=1;
if(s[j]>='0'&&s[j]<='9')
{
bs=0;
while(s[j]>='0'&&s[j]<='9')
{
bs=bs*10+(s[j]-'0');
j++;
}
}
}
//printf("()=====%d %d\n",kh,bs);
sum+=kh*bs;
}
}
sum*=ff;
printf("%04d\n",sum);
}
}