有机物燃烧的化学方程式配平(洛谷P1994题题解,Java语言描述)

题目要求

P1994题目链接
在这里插入图片描述

分析

我太菜了,亏得我高中时期还虐(or被虐)生化,如今多年过去竟然没分析出来坑点,我太菜了。

我开始盲目认为“元素守恒”,所以对 H H 原子数求和,

C x H y O z C_xH_yO_z 与氧气反应的化学方程式:
C x H y O z + ( x + y 4 z 2 ) + O 2 x C O 2 + y 2 H 2 O C_xH_yO_z+(x+\frac{y}{4}-\frac{z}{2})+O_2→xCO_2+\frac{y}{2} H_2O

  • y 2 \frac{y}{2} 要是个整数,所以若 y y 是个奇数,那就要 × 2 \times2
  • ( x + y 4 z 2 ) (x+\frac{y}{4}-\frac{z}{2}) 是个整数,因为 x x 是个整数,所以要求 ( y 4 z 2 ) (\frac{y}{4}-\frac{z}{2}) 是个整数,若此式不为整数,则继续 × 2 \times2 ,即可配平为全整数系数。

AC代码(Java语言描述)

import java.util.Scanner;

public class Main {

    private static int i = 0, c_counter = 0, h_counter = 0, o_counter = 0, temp = 0;

    private static char[] formula;

    private static int count() {
        int counter = 0;
        while (++i < formula.length && Character.isDigit(formula[i])) {
            temp *= 10;
            temp += formula[i]-'0';
        }
        if (temp == 0) {
            counter++;
        } else {
            counter += temp;
            temp = 0;
        }
        return counter;
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        formula = scanner.nextLine().toCharArray();
        scanner.close();
        for ( ; i < formula.length; ) {
            switch (formula[i]) {
                case 'C':
                    c_counter += count();
                    break;
                case 'H':
                    h_counter += count();
                    break;
                default:
                    o_counter += count();
            }
        }
        while ((h_counter & 1) != 0 || (h_counter - 2*o_counter) % 4 != 0) {
            c_counter <<= 1;
            h_counter <<= 1;
            o_counter <<= 1;
        }
        System.out.println(c_counter + " " + h_counter/2);
    }

}
发布了703 篇原创文章 · 获赞 1493 · 访问量 68万+

猜你喜欢

转载自blog.csdn.net/weixin_43896318/article/details/104844204