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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章