• 挑战密室


    Description

    R组织的特工Dr. Kong 为了寻找丢失的超体元素,不幸陷入WTO密室。Dr. Kong必须尽快找到解锁密码逃离,否则几分钟之后,WTO密室即将爆炸。

     

    Dr. Kong发现密室的墙上写了许多化学方程式中。化学方程式,也称为化学反应方程式,是化学式表示物质化学反应的式子。化学方程式反映的是客观事实。因此书写化学方程式要遵守两个原则:一是必须以客观事实为基础;二是要遵守质量守恒定律。

    化学方程式不仅表明了反应物、生成物和反应条件。同时,化学计量数代表了各反应物、生成物物质的量关系,通过相对分子质量或相对原子质量还可以表示各物质之间的质量关系,即各物质之间的质量比。对于气体反应物、生成物,还可以直接通过化学计量数得出体积比。例如:2NaOH+H2SO4=Na2SO4+2H2O

     

    经过多次试探、推理,Dr. Kong发现密码是4位数字,就隐藏在化学方程式等号后的第一个分子中,其分子量就可能是密码(若分子量不足4位,前面加0)。

    好在Dr. Kong还记得墙上各化学方程式用到的化学元素的原子量如下:

     

    N

    C

    O

    Cl

    S

    H

    Al

    Ca

    Zn

    Na

    14

    12

    16

    35

    32

    2

    27

    40

    65

    23

     

    你能帮Dr. Kong尽快找到密码吗?

    Input

    第一行: K     表示有K化学方程式;

    接下来有K行,每行为一个化学方程式

    2≤K≤8  ,化学方程式的长度不超过50, 所有原子,分子的数量不超过9.小括号最多一层.

    Output

    对于每个化学方程式输出一行:即密码。

    Sample Input

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

    Sample Output

    0056
    0142
    0116
      1 #include <cstdio>
      2 #include <cstring>
      3 char str[60];
      4 int judge(char c)
      5 {
      6     if(c >= '0' && c <= '9')
      7     return 1;
      8     else
      9     return 0;
     10 }
     11 int main()
     12 {
     13     int t, i, j;
     14     int num;//几个分子 
     15     char a[60];
     16     int sum;//总分子量
     17     int v;//当前原子分子量 
     18     int temp;//括号外面数字 
     19     scanf("%d", &t);
     20     while(t--)
     21     {
     22         scanf("%s", a);
     23         for(i = 0; i < strlen(a); i++)
     24         if(a[i] == '=')
     25         break;
     26         i = i + 1;
     27         for(j = 0; i < strlen(a) && a[i] != '+'; j++, i++)
     28         {
     29             str[j] = a[i];
     30         }
     31         str[j] = '';
     32         num = 1;
     33         int start = 0;
     34         if(judge(str[0])) 
     35         {
     36             start++;
     37             num = str[0] - '0';
     38         }
     39         sum = 0;
     40         for(i = start; i < strlen(str); i++)
     41         {
     42             if(str[i] == '(')
     43             {
     44                 int s = 0;//计算括号里面的分子量 
     45                 for(; i < strlen(str) && str[i] != ')'; i++)
     46                 {
     47                     if(str[i] == 'S' || str[i] == 'O' || str[i] == 'H')
     48                     {
     49                         if(str[i] == 'S')
     50                         v = 32;
     51                         else if(str[i] == 'O')
     52                         v = 16;
     53                         else
     54                         v = 2;
     55                         if(judge(str[i+1]))//后一项是数字 
     56                         {
     57                             s += v * (str[i+1] - '0'); 
     58                             i += 1;
     59                         } 
     60                         else
     61                         s += v;
     62                     }
     63                     else if(str[i] == 'Z' || str[i] == 'A')
     64                     {
     65                         if(str[i] == 'Z')
     66                         v = 65;
     67                         else
     68                         v = 27;
     69                         if(judge(str[i+2]))
     70                         {
     71                             s += v * (str[i+2] - '0');
     72                             i += 2;
     73                         }
     74                         else
     75                         s += v;
     76                     }
     77                     else if(str[i] == 'N')
     78                     {
     79                         if(judge(str[i+1]))
     80                         {
     81                             s += 14 * (str[i+1] - '0');
     82                             i += 1;
     83                         }
     84                         else if(str[i+1] == 'a')
     85                         {
     86                             if(judge(str[i+2]))
     87                             {
     88                                 s += 23 * (str[i+2] - '0');
     89                                 i += 2;
     90                             }
     91                             else
     92                             {
     93                                 s += 23;
     94                                 i += 1;
     95                             }
     96                         }
     97                         else
     98                         s += 14;
     99                     } 
    100                     else if(str[i] == 'C')
    101                     {
    102                         if(judge(str[i+1]))
    103                         {
    104                             s += 12 * (str[i+1] - '0');
    105                             i += 1;
    106                         }
    107                         else if(str[i+1] == 'l' || str[i+1] == 'a')
    108                         {
    109                             if(str[i+1] == 'l')
    110                             v = 35;
    111                             else
    112                             v = 40;
    113                             if(judge(str[i+2]))
    114                             {
    115                                 s += v * (str[i+2] - '0');
    116                                 i += 2;
    117                             }
    118                             else
    119                             {
    120                                 s += v;
    121                                 i += 1;
    122                             }
    123                         }
    124                         else
    125                         s += 12;
    126                     }
    127                 }
    128                 temp = 1;//括号后面是否有数字 
    129                 if(judge(str[i+1])) temp = str[i+1] - '0';
    130                 sum += s * temp;
    131             }
    132             else
    133             {
    134                 if(str[i] == 'S' || str[i] == 'O' || str[i] == 'H')
    135                 {
    136                     if(str[i] == 'S')
    137                     v = 32;
    138                     else if(str[i] == 'O')
    139                     v = 16;
    140                     else
    141                     v = 2;
    142                     if(judge(str[i+1]))//后一项是数字 
    143                     {
    144                         sum += v * (str[i+1] - '0'); 
    145                         i += 1;
    146                     } 
    147                     else
    148                     sum += v;
    149                 }
    150                 else if(str[i] == 'Z' || str[i] == 'A')
    151                 {
    152                     if(str[i] == 'Z')
    153                     v = 65;
    154                     else
    155                     v = 27;
    156                     if(judge(str[i+2]))
    157                     {
    158                         sum += v * (str[i+2] - '0');
    159                         i += 2;
    160                     }
    161                     else
    162                     sum += v;
    163                 }
    164                 else if(str[i] == 'N')
    165                 {
    166                     if(judge(str[i+1]))
    167                     {
    168                         sum += 14 * (str[i+1] - '0');
    169                         i += 1;
    170                     }
    171                     else if(str[i+1] == 'a')
    172                     {
    173                         if(judge(str[i+2]))
    174                         {
    175                             sum += 23 * (str[i+2] - '0');
    176                             i += 2;
    177                         }
    178                         else
    179                         {
    180                             sum += 23;
    181                             i += 1;
    182                         }
    183                     }
    184                     else
    185                     sum += 14;
    186                 } 
    187                 else if(str[i] == 'C')
    188                 {
    189                     if(judge(str[i+1]))
    190                     {
    191                         sum += 12 * (str[i+1] - '0');
    192                         i += 1;
    193                     }
    194                     else if(str[i+1] == 'l' || str[i+1] == 'a')
    195                     {
    196                         if(str[i+1] == 'l')
    197                         v = 35;
    198                         else
    199                         v = 40;
    200                         if(judge(str[i+2]))
    201                         {
    202                             sum += v * (str[i+2] - '0');
    203                             i += 2;
    204                         }
    205                         else
    206                         {
    207                             sum += v;
    208                             i += 1;
    209                         }
    210                     }
    211                     else
    212                     sum += 12;
    213                 }
    214             } 
    215         }
    216         printf("%04d
    ", sum * num);
    217     }
    218     return 0;
    219 } 
    View Code
    
    
    
     
    
    

      

     
  • 相关阅读:
    Use the Microsoft C++ toolset from the command line
    libeay32.dll 和 ssleay32.dll 在1.1.0之后没有了
    libeay32.dll 1.0.2j crash
    VHD VHDX 区别
    char * 转 wchar *
    C++ 0xC0000094: Integer division by zero
    爬取人人网
    伪造请求头向url传递参数爬取百度默认翻译
    爬取百度贴吧
    urllib爬取实例
  • 原文地址:https://www.cnblogs.com/PersistFaith/p/4816809.html
Copyright © 2020-2023  润新知