zoukankan      html  css  js  c++  java
  • 挑战密室(模拟)

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

    */

    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

    */

    梦里不知身是客,一晌贪欢。
  • 相关阅读:
    编译freeglut-3.0.0的Windows版静态库,及其使用示例
    关于网络安全与实名上网的通知
    【机器学习库】mlpack 2.1.1 Ubuntu14.0.4 踩坑记录
    【OpenCV】在Linux下用CMAKE编译安装OpenCV3.2.0
    【Python装饰者】在函数测试的作用
    【校验】TCP和UDP的校验和
    【C++设计模式】单件类与DCLP(Double Check Lock Pattern)的风险
    【爬虫】Python2 爬虫初学笔记
    【统计学习】SVM之超平面方程来源
    【滤波】标量Kalman滤波的过程分析和证明及C实现
  • 原文地址:https://www.cnblogs.com/dccmmtop/p/5520562.html
Copyright © 2011-2022 走看看