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
32C+O2=2CO2NaOH+H2SO4=Na2SO4+2H2OCa2CO3+H2O=Ca2(OH)2+CO2
Sample Output
00560142 0116
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
![](https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif)
1 #include2 #include 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] = '\0'; 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 else112 v = 40;113 if(judge(str[i+2]))114 {115 s += v * (str[i+2] - '0');116 i += 2;117 }118 else119 {120 s += v;121 i += 1;122 }123 }124 else125 s += 12;126 }127 }128 temp = 1;//括号后面是否有数字 129 if(judge(str[i+1])) temp = str[i+1] - '0';130 sum += s * temp;131 }132 else133 {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 else141 v = 2;142 if(judge(str[i+1]))//后一项是数字 143 {144 sum += v * (str[i+1] - '0'); 145 i += 1;146 } 147 else148 sum += v;149 }150 else if(str[i] == 'Z' || str[i] == 'A')151 {152 if(str[i] == 'Z')153 v = 65;154 else155 v = 27;156 if(judge(str[i+2]))157 {158 sum += v * (str[i+2] - '0');159 i += 2;160 }161 else162 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 else179 {180 sum += 23;181 i += 1;182 }183 }184 else185 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 else199 v = 40;200 if(judge(str[i+2]))201 {202 sum += v * (str[i+2] - '0');203 i += 2;204 }205 else206 {207 sum += v;208 i += 1;209 }210 }211 else212 sum += 12;213 }214 } 215 }216 printf("%04d\n", sum * num);217 }218 return 0;219 }