问题 A: 挑战密室

题目描述

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尽快找到密码吗?

约束条件

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

输入

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

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

输出

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

样例输入

32C+O2=2CO2NaOH+H2SO4=Na2SO4+2H2OCa2CO3+H2O=Ca2(OH)2+CO2

样例输出

005601420116

就是一个麻烦题,很好理解,就是写的时候复杂点,要判断前导是否有数,和括号里面的数单独判断一下。

对字符进行判断的时候可以用一个循环来写,判断3位就行了。

看代码:

# include <stdio.h>
# include <string.h>
char a[60];
int sum1, sum, i, q;

int qwe(int c)
{
	// 判断 Al 字符 
	if (a[c] == 'A')
	{
		if (a[c+2] >= '0' && a[c+2] <= '9')
			{
				q = c+2;
				return 27*(a[c+2]-'0');		
		}
		else
		{
			q = c+1;
			return  27;
		}
	} 
	// 判断字符 Zn 
	else if (a[c] == 'Z')
	{
		if (a[c+2] >= '0' && a[c+2] <= '9')
		{
			q = c+2;
			return  65*(a[c+2]-'0');	
		}
		else
		{
			q = c+1;
			return  65;	
		}
	}
	// 判断 C 
	else if (a[c] == 'C')
	{
		// 判断 Cl 
		if (a[c+1] == 'l')
		{
			if (a[c+2] >= '0' && a[c+2] <= '9')
			{
				q = c+2;
				return  35*(a[c+2]-'0');		
			}
			else
			{
				q = c+1;
				return  35;		
			}
		}
		// 判断 Ca 
		else if (a[c+1] == 'a')
		{
			if (a[c+2] >= '0' && a[c+2] <= '9')
			{
				q = c+2;
				return  40*(a[c+2]-'0');	
			}
			else
			{	
				q = c+1;
				return  40;	
			}	
		}
		// 判断 C 
		else
		{
			if (a[c+1] >= '0' && a[c+1] <= '9')
			{
				q = c+1;
				return  12*(a[c+1]-'0');		
			}
			else
			{
				q = c;
				return  12;
			}
		}
	}
	// 判断 N 
	else if (a[c] == 'N')
	{
		//  判断 Na 
		if (a[c+1] == 'a')
		{
			if (a[c+2] >= '0' && a[c+2] <= '9')
			{
				q = c+2;
				return  23*(a[c+2]-'0');		
			}
			else
			{
				q = c+1;
				return  23;
			}
		}
		// 判断 N 
		else
		{
			if (a[c+1] >= '0' && a[c+1] <= '9')
			{
				q = c+1;
				return  14*(a[c+1]-'0');	
			}
			else
			{
				q = c;
				return  14;
			}
		}
	}
	// 判断 O 
	else if (a[c] == 'O')
	{
		if (a[c+1] >= '0' && a[c+1] <= '9')
		{
			q = c+1; 
			return  16*(a[c+1]-'0');		
		}
		else
		{
			q = c;
			return  16;
		}
	}
	// 判断 S 
	else if (a[c] == 'S')
	{
		if (a[c+1] >= '0' && a[c+1] <= '9')
		{
			q = c+1; 
			return  32*(a[c+1]-'0');		
		}
		else
		{
			q = c;
			return  32;
		}
	} 
	// 判断 H 
	else if (a[c] == 'H')
	{
		if (a[c+1] >= '0' && a[c+1] <= '9')
		{
			q = c+1;
			return  2*(a[c+1]-'0');
		}
		else
		{
			q = c;
			return 2;
		}
	}
}

int main(void)
{

	int t, d, i, j, c, c1, sum2, sum3;
	scanf("%d", &t);
	while (t --)
	{
		sum = 0, sum1 = 0, sum2 = 0, sum3 = 0;
		scanf("%s", a);
		d = strlen(a);
		// 寻找等号的位置 
		for (i = 0; i < d; i ++)
		{
			if (a[i] == '=')
			{
				c = i+1;
				break;
			}
		}
		c1 = d-1;   // 如果没有+号 记录最后一个位置 
		for (i = c; i < d; i ++)
		{
			if (a[i] == '+')
			{
				c1 = i-1; // 如果有  记录+号的位置 
				break;
			}
		}
		for (i = c; i <= c1; i ++)
		{
			//  判断前导的系数 
			if (a[i] >= '0' && a[i] <= '9' && i == c)
			{
				while (1)
				{
					if (!(a[i] >= '0' && a[i] <= '9'))
					break;
					sum = sum*10 + a[i]-'0';
					i ++; 
				}
				i --;
			}
			else
			{
				// 判断括号里面的数字 
				if (a[i] == '(')
				{
					for (j = i+1; a[j] != ')'; j ++)
					{
						sum3 += qwe(j);
						j = q;
					}			
					sum3 = sum3*(a[j+1]-'0');
					i = j+1;
				}
				// 括号外面的 
				else
				{
					sum2 += qwe(i);
					i = q;						
				}	
			}
		}
		if (sum == 0)
			sum = 1;
		printf("%04d\n", sum*(sum2 + sum3));
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/liu344439833/article/details/80272420