题目:
挑战密室
时间限制:
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还记得墙上各化学方程式用到的化学元素的原子量如下:
N
C
O
Cl
S
H
Al
Ca
Zn
Na
14
12
16
35
32
2
27
40
65
23
你能帮Dr. Kong尽快找到密码吗?
-
输入
-
第一行: K,表示有K个化学方程式;
接下来有K行,每行为一个化学方程式
输出
- 对于每个化学方程式输出一行:即密码。 样例输入
-
32C+O2=2CO2NaOH+H2SO4=Na2SO4+2H2OCa2CO3+H2O=Ca2(OH)2+CO2
样例输出
-
005601420116
提示
- 2≤K≤8 ,化学方程式的长度不超过50, 所有原子,分子的数量不超过9.小括号最多一层. 来源
- 第八届河南省程序设计大赛
-
第一行: K,表示有K个化学方程式;
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <cstring>
#include <climits>
#include <cmath>
#include <cctype>
using namespace std;
char a[55];
char b[55];
char c[55];
int qiu(char b[],int m)
{
int i;
int sum1 = 0,sum;
for(i=0; i<m; i++)
{
//cout<<i<<endl;
sum = 0;
if(b[i] == 'C' && b[i+1] == 'l')
{
sum += 35;
if(b[i+2] >='0' && b[i+2] <= '9' && i + 2 < m)//怕超出界限
{
sum *= (b[i+2] - '0');
i = i + 2;
}
else
{
i = i + 1;
}
}
else if(b[i] == 'A' && b[i+1] == 'l')
{
sum += 27;
if(b[i+2] >='0' && b[i+2] <= '9' && i + 2 < m)
{
sum *= (b[i+2] - '0');
i = i + 2;
}
else
{
i = i + 1;
}
}
else if(b[i] == 'C' && b[i+1] == 'a')
{
sum += 40;
if(b[i+2] >='0' && b[i+2] <= '9' && i + 2 < m)
{
sum *= (b[i+2] - '0');
i = i + 2;
}
else
{
i = i + 1;
}
}
else if(b[i] == 'Z' && b[i+1] == 'n')
{
sum += 65;
if(b[i+2] >='0' && b[i+2] <= '9' && i + 2 < m)
{
sum *= (b[i+2] - '0');
i = i + 2;
}
else
{
i = i + 1;
}
}
else if(b[i] == 'N' && b[i+1] == 'a')
{
sum += 23;
if(b[i+2] >='0' && b[i+2] <= '9' && i + 2 < m)
{
sum *= (b[i+2] - '0');
i = i + 2;
}
else
{
i = i + 1;
}
}
else if(b[i] == 'N')
{
sum += 14;
if((b[i+1] >= '0' && b[i+1] <= '9') && i + 1 < m)
{
sum *= (b[i+1] - '0');
i = i + 1;
}
}
else if(b[i] == 'C')
{
sum += 12;
if((b[i+1] >= '0' && b[i+1] <= '9') && i + 1 < m)
{
sum *= (b[i+1] - '0');
i = i + 1;
}
}
else if(b[i] == 'O')
{
sum += 16;
if((b[i+1] >= '0' && b[i+1] <= '9') && i + 1 < m)
{
sum *= (b[i+1] - '0');
i = i + 1;
}
}
else if(b[i] == 'S')
{
sum += 32;
if((b[i+1] >= '0' && b[i+1] <= '9') && i + 1 < m)
{
sum *= (b[i+1] - '0');
i = i + 1;
}
}
else if(b[i] == 'H')
{
sum += 2;
if((b[i+1] >= '0' && b[i+1] <= '9') && i + 1 < m)
{
sum *= (b[i+1] - '0');
i = i + 1;
}
}
sum1 += sum;
}
return sum1;
}
int main()
{
int i,j,k;
int t;
int cheng;
scanf("%d",&t);
getchar();//放到这里别放到while里面
while(t--)
{
cheng = 1;
gets(a);
int n = strlen(a);
k = 0;
for(i=0; i<n; i++)
{
if(a[i] == '=')
{
for(j=i+1; j<n; j++)
{
if(a[j] == '+')
break;
b[k++] = a[j];
}
break;
}
}//把括号和加号里面的字符串截出来
int sum = 0,sum1;
int m = k;
for(i=0; i<m; i++)
{
if(b[i] == '(')
{
sum1 = 0;
k = 0;
for(j=i+1; j<m; j++)
{
if(b[j] == ')')
break;
c[k++] = b[j];
}
sum1 = qiu(c,k);
j++;
if(b[j] >= '0' && b[j] <='9')
sum1 *= (b[j] - '0');
sum += sum1;
}
}//加上括号里面的值
if(b[0] >= '0' && b[0] <= '9')
{
cheng = b[0] - '0';
i = 1;
}
else
{
i = 0;
}
k = 0;//判断第一个是否为数字
for(; i<m; i++)
{
if(b[i] == '(')
{
i++;
while(1)
{
if(b[i] == ')')
break;
i++;
}
if(b[i+1] >= '0' && b[i+1] <= '9')
i += 1;
}
else
{
c[k++] = b[i];
}
}//加上括号外面的值
sum += qiu(c,k);
sum *= cheng;
printf("%04d\n",sum);
}
}