CodeXTreme工作室 2024-09-28 13:27 采纳率: 20%
浏览 3

C++debug化学方程式

题目描述
化学方程式,也称为化学反应方程式,是用化学式表示物质化学反应的式子。书写化学方程式要遵守两个原则:一是必须以客观事实为基础;二是要遵守质量守恒定律。
例如铁丝在氧气中燃烧的方程为: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;
}
  • 写回答

1条回答 默认 最新

  • 一轮明月照丘壑 2024-09-28 13:28
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    这段代码实现了对化学方程式的配平。它首先读取一个字符串形式的化学方程式,然后分析这个字符串,计算出反应物和生成物中各种原子的数量。之后,它比较反应前后的原子数量,找出需要添加的原子和数量。最后,它按照字典序从小到大输出每个原子及其数量。

    代码的主要步骤如下:

    1. 读取输入的化学方程式字符串。
    2. 遍历字符串中的每个字符,如果遇到数字,则将该数字乘以当前的times(系数),如果当前字符是字母(表示一种原子),则将其对应的原子计数增加当前系数倍的数。每遇到一个加号或者等号,表示当前原子配平结束,更新其计数并重置系数times为1。在等号处开始记录生成物的原子计数。如果字符串结束还没有遇到等号,则在最后一个原子后面补一个等号并认为它是在生成物部分。这个过程中还利用了数组cnt1和cnt2来分别记录反应物和生成物的原子计数。如果遇到一个等号或者字符串结束,将当前原子配平完成并更新其计数。如果当前字符是等号,则标记flag为true表示开始记录生成物的原子计数。
    3. 计算反应前后的原子数量差(即需要添加的原子数量),保存在数组c中。对于每个需要添加的原子,输出其字母和数量。如果某个原子的数量为负值,说明需要在生成物中删除相应的原子数量。输出的顺序是按照字典序从小到大排序的。由于字母的大小写可以看作连续的整数('A'-'Z'对应0-25),所以可以直接用字母的ASCII码进行索引和排序。最后返回结果即可。

    这段代码可以满足给定的数据范围和数据特性(只有化学元素的情况)。但要注意一点是输入时的化学反应式应为化学式以及系数相加的形式,如 A+B=CAB+CD=EFG 等形式。如果输入的化学反应式不满足这种形式,代码可能无法正确工作。

    评论

报告相同问题?

问题事件

  • 创建了问题 9月28日