• 挑战密室(模拟)


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

    */

    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]='';
    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
    ",xiSHu*SUM);///不足四位补零
    }
    
    return 0;
    

    }

    /**
    3
    2C+O2=2CO
    2NaOH+H2SO4=Na2SO4+2H2O
    Ca2CO3+H2O=Ca2(OH)2+CO2

    */

    梦里不知身是客,一晌贪欢。
  • 相关阅读:
    设计模式与23种设计模式的简单介绍
    一文读懂C++ Vector在算法竞赛中的常见用法
    一文读懂C++ String类在算法竞赛中的常见用法
    GO语言的单元测试与性能测试
    变量提升和函数提升及二者优先级
    闭包
    读《你不知道的JavaScript 中》-异步【3】Promise
    js数组方法-改变原数组和不改变原数组
    读《你不知道的JavaScript 中》-异步【2】回调
    组合类算法问题
  • 原文地址:https://www.cnblogs.com/dccmmtop/p/5520562.html
Copyright © 2020-2023  润新知