題目描述:
化學方程式,也稱爲化學反應方程式,是用化學式表示化學反應的式子。給出一組化學方程式,請你編寫程序判斷每個方程式是否配平。
本題給出的化學方程式由大小寫字母、數字和符號組成,不會出現其他字符。(詳見輸入樣例)
判斷輸入的化學方程式是否配平,是則輸出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;
}