CCF 201912-3 化學方程式

題目描述:

化學方程式,也稱爲化學反應方程式,是用化學式表示化學反應的式子。給出一組化學方程式,請你編寫程序判斷每個方程式是否配平。
本題給出的化學方程式由大小寫字母、數字和符號組成,不會出現其他字符。(詳見輸入樣例)
判斷輸入的化學方程式是否配平,是則輸出Y,否則輸出N。

輸入描述:

第一行一個正整數n。
接下來n行,每行一個化學方程式。

輸出描述:

n行。
配平輸出Y,否則輸出N。

輸入樣例:

2
H2+O2=H2O
H2+Cl2=2HCl

輸出樣例:

N
Y

得滿分需要處理括號,下面的程序沒處理括號,可得60分。

代碼如下:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=1e3+20;
char s[N];
int len,a[N],b[N];
bool shu(int k)
{
	if(s[k]>='0'&&s[k]<='9')
		return 1;
	return 0;
}
bool da(int k)
{
	if(s[k]>='A'&&s[k]<='Z')
		return 1;
	return 0;
}
bool xiao(int k)
{
	if(s[k]>='a'&&s[k]<='z')
		return 1;
	return 0;
}
//處理一個化學式,p代表等號的左側或右側,st是開始位置,en是終止位置,k爲係數 
void fun(int *p,int st,int en,int k)
{
	int i=st;
	while(i<=en)
	{
		int u,z;
		if(i+1<=en&&xiao(i+1))
		{
			u=(s[i]-'A'+1)*26+s[i+1]-'a';
			z=i+2;
		}
		else
		{
			u=s[i]-'A';
			z=i+1;
		}
		int tz=0;
		while(z<=en&&shu(z))
		{
			tz=tz*10+s[z]-'0';
			z++;
		}
		if(!tz)tz=1;
		p[u]+=k*tz;
		i=z;
	}
	return;
}
int main()
{
	int n;
	cin>>n;
	for(int i=0; i<n; i++)
	{
		scanf("%s",s);
		len=strlen(s);
		for(int j=0; j<N; j++)
			a[j]=b[j]=0;
		//找等號的位置 
		int mid=0;
		for(int j=0;; j++)
			if(s[j]=='=')
			{
				mid=j;
				break;
			}
		int v=0;
		while(v<mid)//處理等號左側 
		{
			//處理係數 
			int tz=0;
			while(shu(v))
			{
				tz=tz*10+s[v]-'0';
				v++;
			}
			if(!tz)tz=1;
			//確定化學式起始位置
			int st=v;
			while(v<mid&&s[v]!='+')v++;
			fun(a,st,v-1,tz);
			v++;
		}
		while(v<len)//處理等號右側 
		{
			//處理係數 
			int tz=0;
			while(shu(v))
			{
				tz=tz*10+s[v]-'0';
				v++;
			}
			if(!tz)tz=1;
			//確定化學式起始位置 
			int st=v;
			while(v<len&&s[v]!='+')v++;
			fun(b,st,v-1,tz);
			v++;
		}
		//判斷是否配平 
		int flag=0;
		for(int i=0;i<N;i++)
			if(a[i]!=b[i])
			{
				flag=1;
				break;
			}
		if(flag)printf("N\n");
		else printf("Y\n");
	}
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章