挑战密室(模拟)
/**
本题的关键是 一次判断两个字符从而确定化学式的分子质量
直接模拟
*/
include<stdio.h>
include<string.h>
include
include
using namespace std;
char s[50];
int jieQu(char *s1)///截取等于号后面的第一个化学式
{
int n=strlen(s1);
int op=0,k=0;
for(int i=0; i<n; i++)
{
if(s1[i]'+')op=0;
if(op1)s[k++]=s1[i];
if(s1[i]=='=')
op=1;
}
s[k]='\0';
return k;
}
int zhuanHuan(char a,char b)///一次传入两个字符
{
if(a'N'&&b!='a')return 14;
if(a'C'&&b!='l'&&b!='a')return 12;
if(a'O')return 16;
if(a'S')return 32;
if(a'H')return 2;
if(a'C'&&b'l')return 35;
if(a'A'&&b'l')return 27;
if(a'C'&&b'a')return 40;
if(a'Z'&&b'n')return 65;
if(a'N'&&b=='a')return 23;
return 0;
}
bool isNum(char a)
{
if(a>='0'&&a<='9')return true;
return false;
}
bool isChar(char a)
{
if(a>='A'&&a<='Z')return true;
return false;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
char s1[100];
scanf("%s",s1);
stack
int n=jieQu(s1);
int xiSHu=0;
int nI=0;
for(int i=0; i<n; i++)///第一个数字 即该化学式的系数
{
if(isNum(s[i]))
xiSHu=xiSHu*10+(s[i]-'0');
else
{
nI=i;
break;
}
}
if(xiSHu==0)xiSHu=1;///如果没有系数 置为1
int num1=0;
for(int i=nI; i<=n; i++)///注意i<=n 因为最后一位也可能是数字
{
if(isNum(s[i]))///找连续的数字
num1=num1*10+(s[i]-'0');
else
{
if(num1!=0)///数字结束 将该元素乘以数字num1; 如果i<n 的话将无法判断
///最后的数字是否结束ru Ca2(OH)2
{
num1*=sum.top();
sum.pop();
sum.push(num1);
num1=0;
}
}
if(s[i]=='(')sum.push(-1);
if(s[i]==')')///计算括号内的元素
{
int num=0;
while(1)
{
if(sum.top()==-1)///遇到一个左括号结束 (括号匹配)
{
sum.pop();
break;
}
num+=sum.top();
sum.pop();
}
sum.push(num);///将括号内的元素之和入栈
}
if(isChar(s[i]))
{
int zhiLaing=zhuanHuan(s[i],s[i+1]);
sum.push(zhiLaing);
}
}
int SUM=0;
while(!sum.empty())///将栈内的分子式质量加到一起
{
SUM+=sum.top();
sum.pop();
}
printf("%04d\n",xiSHu*SUM);///不足四位补零
}
return 0;
}
/**
3
2C+O2=2CO
2NaOH+H2SO4=Na2SO4+2H2O
Ca2CO3+H2O=Ca2(OH)2+CO2
*/