挑战密室(模拟)
挑战密室(模拟)
1944864971 发表于2年前
挑战密室(模拟)
  • 发表于 2年前
  • 阅读 3
  • 收藏 0
  • 点赞 0
  • 评论 0

【腾讯云】新注册用户域名抢购1元起>>>   

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

*/

include

include

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);
stack sum;
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

*/

  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 0
博文 57
码字总数 0
×
1944864971
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: