提示
2≤K≤8 ,化学方程式的长度不超过50, 所有原子,分子的数量不超过9.小括号最多一层.
来源
上传者
//我用的是数组模拟,当然也可以用栈来做,和表达式求值是类似的
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
using namespace std;
int main()
{
int t;
scanf("%d",&t);
getchar();
while(t--)
{
int i,j,len,m,n;
char a[1005];
gets(a);
len=strlen(a);
int flag=0,ans=0,ants,tlag=1,tt,slag=0,antt=0;
for(i=0;i<len;i++)
{
if(a[i-1]=='='&&a[i]>='2'&&a[i]<='9')//等号后面有数字的情况
tlag=a[i]-'0';//表示等号后面有数字要乘的倍数,没有的话就是乘1,tlag初始值设为了1
if(flag==1)//是等号后面需要判断的情况
{
if(a[i]=='(')//遇到左括号需要先把括号里的所有相对原子质量都加起来
{
slag=1;
}
if(a[i]=='N'&&a[i+1]=='a')
{
if(slag==1)//如若遇到左括号,以下判断都类似
antt+=23;//存放括号里的分子量,以下判断都类似
ants=23,ans+=ants,a[i+1]='1';//ans存放要求的分子量,ants存放当前加上的分子量,以下都类似
}
else if(a[i]=='N')
{
if(slag==1)
antt+=14;
ants=14,ans+=ants;
}
else if(a[i]=='C'&&a[i+1]=='l')
{
if(slag==1)
antt+=35;
ants=35,ans+=35,a[i+1]='1';
}
else if(a[i]=='C'&&a[i+1]=='a')
{
if(slag==1)
antt+=40;
ants=40,ans+=40,a[i+1]='1';
}
else if(a[i]=='C')
{
if(slag==1)
antt+=12;
ants=12,ans+=12;
}
else if(a[i]=='O')
{
if(slag==1)
antt+=16;
ants=16,ans+=16;
}
else if(a[i]=='S')
{
if(slag==1)
antt+=32;
ants=32,ans+=32;
}
else if(a[i]=='H')
{
if(slag==1)
antt+=2;
ants=2,ans+=2;
}
else if(a[i]=='A'&&a[i+1]=='l')
{
if(slag==1)
antt+=27;
ants=27,ans+=27,a[i+1]='1';
}
else if(a[i]=='Z'&&a[i+1]=='n')
{
if(slag==1)
antt+=65;
ants=65,ans+=65,a[i+1]='1';
}
if(a[i]>='2'&&a[i]<='9'&&i!=tt+1)
{
if(a[i-1]==')')
ans+=antt*(a[i]-'1');
else
ans+=(a[i]-'1')*ants;
}
if(a[i]=='+'||a[i]=='\n')//遇到'+'或字符串结束就停止计算
flag=0;
}
if(a[i]=='=')//遇到等号标记flag为1,标记tt是为了看后一个是不是数字
flag=1,tt=i;
}
printf("%04d\n",ans*tlag);
}
return 0;
}