题目描述
化学方程式,也称为化学反应方程式,是用化学式表示物质化学反应的式子。书写化学方程式要遵守两个原则:一是必须以客观事实为基础;二是要遵守质量守恒定律。
例如铁丝在氧气中燃烧的方程为:image.png
大多数的化学方程式在反应前后元素数量不会变化,比如Fe原子在反应前为3,反应后也为3,而配平可以使得方程式遵守质量守恒定律,现随机生成一个反应前后元素数量不变但未完全配平的化学方程式,请你对方程式进行配平。
为了方便描述化学方程式,使用不同的大写字母表示不同的原子,一个字母只能表示一种原子,每项最多4个不同原子,每项前的数字表示方程式系数,字母后的数字表示下标,所有数字在1~9之间,反应条件都省略,我们将上述方程简化表示为:3A+2B2=A3B4。
输入描述
一行,一个字符串,包含数字、大写字母、+号和=号,保证一定有解。
输出描述
输出若干行,输出配平所需的原子(用大写字母表示)及数量,按字典序从小到大每行一个不同的原子。
样例1
输入
3AB+2B+2C=4B+A3
输出
B 1
C 2
提示
【样例解释】
反应前有3个A原子,5个B原子,2个C原子,现在方程反应后缺少1个B原子,2个C原子
【数据范围】
对于30%的数据,只有1个原子未配平;
对于100%的数据,字符串长度不超过1000。
#include<bits/stdc++.h>
using namespace std;
string s;
bool flag;
int times=1;
char tmpAlpha;
int cnt1[30],cnt2[30],c[30];
int main(){
cin>>s;
for(int i=0;i<s.size();i++){
char c=s[i];
//数字
if(c>='1'&&c<='9')times*=(c-'0');
//字母
if(c>='A'&&c<='Z'){
if(times!=1){
if(!flag)cnt1[tmpAlpha-'A']+=times;
if(flag)cnt2[tmpAlpha-'A']+=times;
}
tmpAlpha=c;
}
//加号OR等号OR式子结束
if(c=='+'||c=='='||i==s.size()-1){
if(!flag)cnt1[tmpAlpha-'A']+=times;
if(flag)cnt2[tmpAlpha-'A']+=times;
times=1;
if(c=='=')flag=true;
}
}
for(int i=0;i<26;i++)
c[i]=abs(cnt1[i]-cnt2[i]);
for(int i=0;i<26;i++)
if(c[i])cout<<char(i+'A')<<" "<<c[i]<<endl;
return 0;
}