挑战密室(模拟)

/**
本题的关键是 一次判断两个字符从而确定化学式的分子质量
直接模拟

*/

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(op
1)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);
stacksum;
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

*/

posted @ 2016-05-23 16:48  -梦里不知身是客  阅读(137)  评论(0编辑  收藏  举报