第八屆河南省程序設計大賽~~挑戰密室 nyoj 1236

挑戰密室

時間限制: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行,每行爲一個化學方程式

輸出
對於每個化學方程式輸出一行:即密碼。
樣例輸入
3
2C+O2=2CO2
NaOH+H2SO4=Na2SO4+2H2O
Ca2CO3+H2O=Ca2(OH)2+CO2
樣例輸出
0056
0142
0116
提示
2≤K≤8 ,化學方程式的長度不超過50, 所有原子,分子的數量不超過9.小括號最多一層.
來源
第八屆河南省程序設計大賽
解題思路:字符串處理,看到提示,這道題的難度就小很多,對於每一個化學元素,我們只需最多判斷前三字符即可,

首先判斷是不是化學元素,由題目可知,化學元素最多兩個字符,我們用兩個字符判斷(將在代碼中體現),最後再判斷

化學元素後面有沒有數字。詳情請看代碼
代碼如下:
# include<stdio.h>
# include<string.h>
# include<string>
# include<iostream>
using namespace std;
char a[100],num,len;
int find(string s)
{
	if(s=="N")  return 14;
	if(s=="C")  return 12;
	if(s=="O")  return 16;
	if(s=="Cl")  return 35;
	if(s=="S")  return 32;
	if(s=="H")  return 2;
	if(s=="Al")  return 27;
	if(s=="Ca")  return 40;
	if(s=="Zn")  return 65;
	if(s=="Na")  return 23;
	return 0;
}
void count(char a[],int &i) //計算每一個化學元素的分子質量 
{	num=0;
	string s;
	s+=a[i];
	s+=a[i+1];
	if(find(s)==0) //判斷化學元素是不是 兩個字符 
	{
		s.clear();
		s+=a[i];
		num=find(s);
		i++;
	}
	else{
			num=find(s);     //如果是 
			i+=2;
		}
	if(i<len&&a[i]>'0'&&a[i]<='9') //判斷化學元素後有沒有數字 
	{
		num=num*(a[i]-'0');
		i++;
	}
}
int main(){
	int t;
	scanf("%d",&t);
	getchar();
	while(t--)
	{
		gets(a);
		int sum=0;
		len=strlen(a);
		int i=0;
		while(a[i]!='='&&i<len)
		i++;
		i++;
		int k=1;
		if(a[i]<='9'&&a[i]>'0')
		{
			k=a[i]-'0';
			i++;
		}
		while(a[i]!='+'&&i<len)
		{  
		if(a[i]!='(')	
			{
			count(a,i);	 //計算 
			}
			else 
			{	i++;
			int num1=0;
				while(a[i]!=')') //因爲只有單層的括號 
				{
				count(a,i);	 //計算 
				num1+=num;					
				}				
				i++;
				if(a[i]>'0'&&a[i]<='9')  //判斷括號後有沒有數字 
				num=num1*(a[i]-'0');								
			}
			sum+=num;
		}
		sum*=k;
		int m=sum,l=0;
		while(m>0) //判斷密碼長度 
		{
			l++;
			m/=10;
		}
		for(int j=0;j<4-l;j++)
		printf("0");
		printf("%d\n",sum);
	}
	
	return 0;
}

發佈了189 篇原創文章 · 獲贊 77 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章