• 第八届河南省省赛 A.挑战密室


    挑战密室
    
    时间限制:1000 ms  |  内存限制:65535 KB
    难度:4
     
    描述
    R组织的特工Dr. Kong 为了寻找丢失的超体元素,不幸陷入WTO密室。Dr. Kong必须尽快找到解锁密码逃离,否则几分钟之后,WTO密室即将爆炸。
    
     
    
    Dr. Kong发现密室的墙上写了许多化学方程式中。化学方程式,也称为化学反应方程式,是用化学式表示物质化学反应的式子。化学方程式反映的是客观事实。因此书写化学方程式要遵守两个原则:一是必须以客观事实为基础;二是要遵守质量守恒定律。
    
    化学方程式不仅表明了反应物、生成物和反应条件。同时,化学计量数代表了各反应物、生成物物质的量关系,通过相对分子质量或相对原子质量还可以表示各物质之间的质量关系,即各物质之间的质量比。对于气体反应物、生成物,还可以直接通过化学计量数得出体积比。例如:2NaOH+H2SO4=Na2SO4+2H2O
    
     
    
    经过多次试探、推理,Dr. Kong发现密码是4位数字,就隐藏在化学方程式等号后的第一个分子中,其分子量就可能是密码(若分子量不足4位,前面加0)。
    
    好在Dr. Kong还记得墙上各化学方程式用到的化学元素的原子量如下:
    
      
    
    你能帮Dr. Kong尽快找到密码吗?
    
     
    输入
    第一行: K,表示有K个化学方程式;
    接下来有K行,每行为一个化学方程式
    输出
    对于每个化学方程式输出一行:即密码。
    样例输入
    3
    2C+O2=2CO
    2NaOH+H2SO4=Na2SO4+2H2O
    Ca2CO3+H2O=Ca2(OH)2+CO2
    样例输出
    0056
    0142
    0116
    提示
    2≤K≤8 ,化学方程式的长度不超过50, 所有原子,分子的数量不超过9.小括号最多一层.
    来源
    第八届河南省程序设计大赛

       好吧  ,我承认  这个题  确实  没做成功   一直报错   也不知道是为啥.   反正也是醉了   下面先附上  错误的代码   

      1 #include<stdio.h>
      2 #include<algorithm>
      3 #include<string.h>
      4 #include<math.h>
      5 using namespace std ;
      6 int main()
      7 {
      8     double q,l,m,n,t,sum,w,r;
      9     int i,e;
     10     char a[2050];
     11     scanf("%lf",&t);
     12     while(t--)
     13     {
     14         w=m=0;
     15         scanf("%s",a);
     16         l=strlen(a);
     17         for(i=0;i<l;i++)
     18         {
     19             if(a[i-1]=='=')
     20             {
     21                 break;
     22             }
     23         }
     24         e=i;
     25         for(sum=0;i<l;i++)
     26         {
     27             if(a[i]=='+')
     28                 break;
     29             if(a[e]-'0'>=0&&a[e]-'0'<=9)
     30             {
     31                 r=q=0;
     32                 while(a[i]-'0'>=0&&a[i]-'0'<=9)
     33                 {
     34                     r=r*pow(10,q)+(a[i]-'0');
     35                     q++;
     36                     if(!(a[i+1]-'0'>=0&&a[i+1]-'0'<=9))
     37                         break;
     38                     i++;
     39                 }
     40                 i++;
     41                 e=-1;
     42             }
     43             q=n=0;
     44             if(!(a[i]-'0'>=0&&a[i]-'0'<=9))  //当  这次不是数字     越界的时候 也不是数字哦.
     45             {
     46                 if(a[i]=='(')
     47                 {
     48                     i++;
     49                     while(a[i]=='('||a[i]!=')')
     50                     {
     51                         if(a[i]=='C'&&a[i+1]!='a')
     52                             m+=12;
     53                         else
     54                             if(a[i]=='H')
     55                         m+=2;
     56                         else
     57                             if(a[i]=='O')
     58                         m+=16;
     59                         else
     60                             if(a[i]=='N'&&a[i+1]!='a')
     61                         m+=14;
     62                         else
     63                             if(a[i]=='C'&&a[i+1]=='l')
     64                             {
     65                                 m+=35;
     66                                 i++;
     67                             }
     68                         else
     69                             if(a[i]=='S')
     70                             m+=32;
     71                         else
     72                             if(a[i]=='A'&&a[i+1]=='l')
     73                             {
     74                                 m+=27;
     75                                 i++;
     76                             }
     77                         else
     78                             if(a[i]=='C'&&a[i+1]=='a')
     79                             {
     80                                 m+=40;
     81                                 i++;
     82                             }
     83                         else
     84                             if(a[i]=='Z'&&a[i+1]=='n')
     85                             {
     86                                 m+=65;
     87                                 i++;
     88                             }
     89                         else
     90                             if(a[i]=='N'&&a[i+1]=='a')
     91                             {
     92                                 m+=23;
     93                                 i++;
     94                             }
     95                             if(a[i]==')')
     96                                 i++;
     97                         n=1;
     98                         i++;
     99                     }
    100                 }
    101                 else
    102                 {
    103 
    104                         if(a[i]=='C'&&a[i+1]!='a')
    105                             m+=12;
    106                         else
    107                             if(a[i]=='H')
    108                         m+=2;
    109                         else
    110                             if(a[i]=='O')
    111                         m+=16;
    112                         else
    113                             if(a[i]=='N'&&a[i+1]!='a')
    114                         m+=14;
    115                         else
    116                             if(a[i]=='C'&&a[i+1]=='l')
    117                             {
    118                                 m+=35;
    119                                 i++;
    120                             }
    121                         else
    122                             if(a[i]=='S')
    123                             m+=32;
    124                         else
    125                             if(a[i]=='A'&&a[i+1]=='l')
    126                             {
    127                                 m+=27;
    128                                 i++;
    129                             }
    130                         else
    131                             if(a[i]=='C'&&a[i+1]=='a')
    132                             {
    133                                 m+=40;
    134                                 i++;
    135                             }
    136                         else
    137                             if(a[i]=='Z'&&a[i+1]=='n')
    138                             {
    139                                 m+=65;
    140                                 i++;
    141                             }
    142                         else
    143                             if(a[i]=='N'&&a[i+1]=='a')
    144                             {
    145                                 m+=23;
    146                                 i++;
    147                             }
    148                         n=1;       ////用于处理    当这个化学元素没有后缀时的情况
    149                 }                            
    150             }
    151             if(a[i+1]-'0'>=0&&a[i+1]-'0'<=9)    //有后缀时.
    152             {
    153                 i++;
    154                 n=0;
    155                 while(a[i]-'0'>=0&&a[i]-'0'<=9)
    156                 {
    157                     n=n*pow(10,q)+(a[i]-'0');
    158                     q++;
    159                     if(!(a[i+1]-'0'>=0&&a[i+1]-'0'<=9))
    160                         break;
    161                     i++;
    162                 }
    163             }
    164             sum=sum+m*n;
    165             m=0;
    166         }
    167         printf("%04.lf
    ",r*sum);
    168         r=1;
    169     }
    170     return 0;
    171 }

    比较失败     当一道题   有思路但是是在解决不出来的时候    就删掉  优化着  在写一次.

    -----------------------------------------------------------下面附上正确代码----------------------------------

      1 #include<stdio.h>
      2 #include<math.h>
      3 #include<string.h>
      4 #include<algorithm>
      5 using namespace std;
      6 int main()
      7 {
      8     int i,m,n,t,l,q,w,e,sum,r;
      9     char a[500],b[200];
     10     scanf("%d",&t);
     11     while(t--)
     12     {
     13         scanf("%s",a);                          //开始将需要的字符剥离出来
     14         l=strlen(a);
     15         bool OK =false;
     16         memset(b,'',sizeof(b));
     17         for(r=w=n=q=i=0;i<l;i++)
     18         {
     19             if(a[i-1]=='=')
     20                 OK=true;
     21             if(OK&&a[i]=='+')
     22             {
     23                 OK=false;
     24               //  b[r]='';
     25             }
     26             if(OK)
     27             {
     28                 if(q!=0)                             //  整理完数字       之后    就需要  转存字母了.
     29                 {
     30                     b[w++]=a[i];
     31                     continue;            //防止 到  else  那里在此赋值  .
     32                 }
     33                 if(((a[i]-'0')<=9&&(a[i]-'0')>=0)&&(w==0&&r==0))          //如果第一个是数字的话........
     34                 {
     35                     while((a[i]-'0')<=9&&(a[i]-'0')>=0)  //将数字 正整理一下
     36                     {
     37                         n=n*pow(10,q)+(a[i]-'0');
     38                         q++;
     39                         i++;
     40                     }  //整理完毕之后
     41                     i--;
     42                 }
     43                 else                     //不是数字的话
     44                 {
     45                     n=1;
     46                     b[r++]=a[i];
     47                 }
     48             }
     49         }
     50         l=strlen(b);
     51         for(sum=i=0;i<l;i++)
     52         {
     53             q=e=0;
     54             if(!(b[i]-'0'>=0&&b[i]-'0'<=9))  //当  这次不是数字     越界的时候 也不是数字哦.
     55             {
     56                 if(b[i]=='(')
     57                 {
     58                     i++;
     59                     m=0;
     60                 while(b[i]!=')')
     61                 {
     62                     if(b[i]=='C'&&b[i]=='a')
     63                 {
     64                     m+=40;
     65                     i++;
     66                 }
     67                 else
     68                     if(b[i]=='N'&&b[i+1]=='a')
     69                 {
     70                     m+=23;
     71                     i++;
     72                 }
     73                 else
     74                     if(b[i]=='Z'&&b[i+1]=='n')
     75                 {
     76                     m+=65;
     77                     i++;
     78                 }
     79                 else
     80                     if(b[i]=='A'&&b[i+1]=='l')
     81                 {
     82                     m+=27;
     83                     i++;
     84                 }
     85                 else
     86                     if(b[i]=='C'&&b[i+1]=='l')
     87                 {
     88                     m+=35;
     89                     i++;
     90                 }
     91                 else
     92                     if(b[i]=='C')
     93                 m+=12;
     94                 else
     95                     if(b[i]=='H')
     96                 m+=2;
     97                 else
     98                     if(b[i]=='O')
     99                 m+=16;
    100                 else
    101                     if(b[i]=='N')
    102                 m+=14;
    103                 else
    104                     if(b[i]=='S')
    105                 m+=32;
    106                 i++;
    107                     }
    108                 }
    109                 else
    110                 if(b[i]=='C'&&b[i]=='a')
    111                 {
    112                     m=40;
    113                     i++;
    114                 }
    115                 else
    116                     if(b[i]=='N'&&b[i+1]=='a')
    117                 {
    118                     m=23;
    119                     i++;
    120                 }
    121                 else
    122                     if(b[i]=='Z'&&b[i+1]=='n')
    123                 {
    124                     m=65;
    125                     i++;
    126                 }
    127                 else
    128                     if(b[i]=='A'&&b[i+1]=='l')
    129                 {
    130                     m=27;
    131                     i++;
    132                 }
    133                 else
    134                     if(b[i]=='C'&&b[i+1]=='l')
    135                 {
    136                     m=35;
    137                     i++;
    138                 }
    139                 else
    140                     if(b[i]=='C')
    141                 m=12;
    142                 else
    143                     if(b[i]=='H')
    144                 m=2;
    145                 else
    146                     if(b[i]=='O')
    147                 m=16;
    148                 else
    149                     if(b[i]=='N')
    150                 m=14;
    151                 else
    152                     if(b[i]=='S')
    153                 m=32;
    154                 e=1;                            //用于处理    当这个化学元素没有后缀时的情况
    155             }
    156             if(b[i+1]-'0'>=0&&b[i+1]-'0'<=9)    //有后缀时.
    157             {
    158                 i++;
    159                 e=0;
    160                 while(b[i]-'0'>=0&&b[i]-'0'<=9)
    161                 {
    162                     e=e*pow(10,q)+(b[i]-'0');
    163                     q++;
    164                     if(!(b[i+1]-'0'>=0&&b[i+1]-'0'<=9))
    165                         break;
    166                     i++;
    167                 }
    168             }
    169             sum=sum+m*e;
    170         }
    171         printf("%04.0lf
    ",double(n*sum));
    172     }
    173     return 0;
    174 }

    ------------------------下面附上 优化之后的  代码   并且   附上解析  -------教训总结--------------------------------   

     1  
     2 #include <stdio.h>
     3 #include <string.h>
     4 char che[10][3]={"N","C","O","Cl","S","H","Al","Ca","Zn","Na"};
     5 int val[10]={14,12,16,35,32,2,27,40,65,23};
     6 int tonum(char str[])
     7 {
     8     for(int i=0;i<10;i++)
     9         if(strcmp(str,che[i])==0)
    10             return val[i]; 
    11 }
    12 int main()
    13 {
    14     int ncase;
    15     char str[500];
    16     scanf("%d",&ncase);
    17     while(ncase--)
    18     {
    19         memset(str,0,sizeof(str));
    20         scanf("%s",str);
    21         bool flag=false;
    22         int k=0;
    23         char word[55];
    24         memset(word,0,sizeof(word));
    25         for(int i=0;i<strlen(str);i++)
    26         {
    27             if(flag&&str[i]=='+')
    28             break;
    29             if(str[i]=='=')
    30             {
    31                 flag=true;
    32                 continue;
    33             }
    34             if(flag)
    35             {
    36                 word[k++]=str[i];
    37             }
    38         }
    39         char ch[3];
    40         int sum=0,head=1,star=0,n;
    41         if(word[0]>='0'&&word[0]<='9')
    42         head=word[0]-'0',star=1;
    43         for(int i=star;i<k;i++)
    44         {
    45             memset(ch,0,sizeof(ch));
    46             n=1;
    47             if(word[i]=='(')
    48             {
    49                 i++;
    50                 int temp=0;
    51                 while(word[i]!=')'&&i<k)
    52                 {
    53                     memset(ch,0,sizeof(ch));
    54                     if((word[i]>='A'&&word[i]<='Z')&&(word[i+1]>='a'&&word[i+1]<='z'))
    55                     {
    56                         if(word[i+2]>='0'&&word[i+2]<='9')
    57                         n=word[i+2]-'0';
    58                         ch[0]=word[i];ch[1]=word[i+1];ch[2]='';
    59                         i++;
    60                         temp+=n*tonum(ch);
    61                     }
    62                     else if((word[i]>='A'&&word[i]<='Z')&&!(word[i+1]>='a'&&word[i+1]<='z'))
    63                     {
    64                         if(word[i+1]>='0'&&word[i+1]<='9')
    65                         n=word[i+1]-'0';
    66                         ch[0]=word[i];ch[1]='';
    67                         temp+=n*tonum(ch);
    68                     }
    69                     i++;
    70                 }
    71                 if(word[i+1]>='0'&&word[i+1]<='9')
    72                 n=word[i+1]-'0';
    73                 sum+=n*temp;
    74             }
    75             else if((word[i]>='A'&&word[i]<='Z')&&(word[i+1]>='a'&&word[i+1]<='z'))
    76             {
    77                 if(word[i+2]>='0'&&word[i+2]<='9')
    78                 n=word[i+2]-'0';
    79                 ch[0]=word[i];ch[1]=word[i+1];ch[2]='';
    80                 i++;
    81                 sum+=n*tonum(ch);
    82             }
    83             else if((word[i]>='A'&&word[i]<='Z')&&!(word[i+1]>='a'&&word[i+1]<='z'))
    84             {
    85                 if(word[i+1]>='0'&&word[i+1]<='9')
    86                 n=word[i+1]-'0';
    87                 ch[0]=word[i];ch[1]='';
    88                 sum+=n*tonum(ch);
    89             }
    90         }
    91         sum=sum*head;
    92         printf("%04d
    ",sum);
    93     }
    94     return 0;
    95 }        
  • 相关阅读:
    数值的整数次方
    Grid Sorting
    第K小的数
    图形学变换矩阵的分解
    神经网络理论简介(三)
    神经网络理论简介(二)
    神经网络理论简介(一)
    C/C++的内存对齐
    strcpy的实现
    C++对象模型简析
  • 原文地址:https://www.cnblogs.com/A-FM/p/5165790.html
Copyright © 2020-2023  润新知