2019年12月CSP考试第三题化学方程式解法

import sys
import re

def merge(m1, m2):
    for key in m1.keys():
        if key in m2.keys():
            m2[key] += m1[key]
        else:
            m2[key] = m1[key]
    return m2

def mul_formula(coef, formula):
    for key in formula.keys():
        formula[key] *= coef
    return formula

def equation(s):
    expr_left, expr_right = s.split("=")
    ret_l, ret_r = {}, {}
    for sub in expr_left.split("+"):
        coef, formula = expr(sub)
        formula = mul_formula(coef, formula)
        ret_l = merge(ret_l, formula)
    for sub in expr_right.split("+"):
        coef, formula = expr(sub)
        formula = mul_formula(coef, formula)
        ret_r = merge(ret_r, formula)
    if ret_l == ret_r:
        return "Y"
    else:
        return "N"

def expr(s):
    coef, s = get_coef(s)
    formula = get_formula(s)
    return coef, formula

def get_coef(s: str):
    if len(s) == 0:
        return 1, ""
    for i, c in enumerate(s):
        if c.isdigit() == False:
            if i == 0:
                return 1, s
            else:
                return int(s[:i]), s[i:]
    return int(s), ""

def get_formula(s: str):
    sp = s
    ret = {}
    while(len(sp)):
        term, sp = get_term(sp)
        coef, sp = get_coef(sp)
        term = mul_formula(coef, term)
        ret = merge(ret, term)
    return ret

def get_term(s: str):
    if s[0] == "(":
        i = 0
        lp = 0
        while True:
            if s[i] == "(":
                lp += 1
            if s[i] == ")":
                lp -= 1
            if lp == 0 and i != 0:
                break
            else:
                i+=1
        formula = s[1:i]
        remain = s[i+1:]
        return get_formula(formula), remain
    else:
        return get_element(s)

def get_element(s: str):
    if len(s) >= 2:
        if s[1].islower():
            return {s[:2]: 1}, s[2:]
    return {s[0]: 1}, s[1:]

if __name__ == "__main__":
    n = int(input())
    for i in range(n):
        eq = input()
        print(equation(eq))
    # print("H2+O2=H2O")
    # print(equation("H2+O2=H2O"))
    # print("2H2+O2=2H2O")
    # print(equation("2H2+O2=2H2O"))
    # print("H2+Cl2=2NaCl")
    # print(equation("H2+Cl2=2NaCl"))
    # print("H2+Cl2=2HCl")
    # print(equation("H2+Cl2=2HCl"))
    # print("CH4+2O2=CO2+2H2O")
    # print(equation("CH4+2O2=CO2+2H2O"))
    # print("CaCl2+2AgNO3=Ca(NO3)2+2AgCl")
    # print(equation("CaCl2+2AgNO3=Ca(NO3)2+2AgCl"))
    # print("3Ba(OH)2+2H3PO4=Ba3(PO4)2+6H2O")
    # print(equation("3Ba(OH)2+2H3PO4=Ba3(PO4)2+6H2O"))
    # print("3Ba(OH)2+2H3PO4=6H2O+Ba3(PO4)2")
    # print(equation("3Ba(OH)2+2H3PO4=6H2O+Ba3(PO4)2"))
    # print("4Zn+10HNO3=4Zn(NO3)2+NH4NO3+3H2O")
    # print(equation("4Zn+10HNO3=4Zn(NO3)2+NH4NO3+3H2O"))
    # print("4Au+8NaCN+2H2O+O2=4Na(Au(CN)2)+4NaOH")
    # print(equation("4Au+8NaCN+2H2O+O2=4Na(Au(CN)2)+4NaOH"))
    # print("Cu+As=Cs+Au")
    # print(equation("Cu+As=Cs+Au"))

原文地址:https://www.cnblogs.com/huangdong2000/p/12430947.html

时间: 2024-10-06 07:31:16

2019年12月CSP考试第三题化学方程式解法的相关文章

蔡康永的说话之道——2019年12月15日

.bodyContainer { font-family: Arial, Helvetica, sans-serif; text-align: center; padding-left: 32px; padding-right: 32px; } .notebookFor { font-size: 18px; font-weight: 700; text-align: center; color: rgb(119, 119, 119); margin: 24px 0px 0px; padding:

23.密码学知识-加密介绍-1——2019年12月19日

2019年12月19日14:51:00 1. 第1天 - 对称加密 1.1 基础知识点 知识点大纲介绍 密码的基础概念 对称加密 非对称加密 单向散列函数 哈希函数 消息认证码 数字签名 证书 ssl/tls - https 为什么要加密, 以及解决方案 保证数据安全 加密三要素 明文/密文 秘钥 定长的字符串 需要根据加密算法确定其长度 算法 加密算法 解密算法 加密算法和解密算法有可能是互逆的, 也有可能相同 常用的两种加密方式 对称加密 秘钥: 加密解密使用的是同一个秘钥, 秘钥有一个 特

33.《高血压看这本就够了》摘录-陈罡——2019年12月22日

.bodyContainer { font-family: Arial, Helvetica, sans-serif; text-align: center; padding-left: 32px; padding-right: 32px; } .notebookFor { font-size: 18px; font-weight: 700; text-align: center; color: rgb(119, 119, 119); margin: 24px 0px 0px; padding:

2019年12月8日 运飞龙 linux

1.system v init运行级别及作用 init运行级别                  作用 0                                  关机 1                                  单用户模式 2                                  多用户的文本界面 3                                  多用户的文本界面 4                             

19.go语言基础学习(上)——2019年12月16日

2019年12月16日16:57:04 5.接口 2019年11月01日15:56:09 5.1 duck typing 1. 2. 接口 3.介绍 Go 语言的接口设计是非侵入式的,接口编写者无须知道接口被哪些类型实现. 而接口实现者只需知道实现的是什么样子的接口,但无须指明实现哪一个接口. 编译器知道最终编译时使用哪个类型实现哪个接口,或者接口应该由谁来实现. 每个接口类型由数个方法组成.接口的形式代码如下: type 接口类型名 interface{ 方法名1( 参数列表1 ) 返回值列表

2019年12月我主要的业力对应关系

本文记录12月我的业力因果,分享给大家,愿协助世界意识更加地提升-感谢- 种子 花了一天时间回顾业力因果,发布了<2019年9-11月份我主要的业力对应关系> 结果 第二天上午,我突然想起了年中尝试过的WebGPU.那时在我的电脑上没有跑起来,于是我就放弃了.我突然领悟到,也许是我电脑的操作系统版本太低,需要升级.于是我就升级了系统,结果就能运行WebGPU了! 种子 在我电脑上能够运行WebGPU 结果 我开始写WebGPU学习系列博文. 我的目的是: 1.通过写文章,来促使自己进一步学习W

更新 | 2019年9月计算机二级office模拟题库

随着2019年上半年计算机二级考试的完美落幕,紧接着的便是9月份的考试了. 到目前为止,下半年9月份计算机二级考试报名开通时间在6月前后,现在也基本结束. 2019年9月(56次)全国计算机等级考试(以下简称NCRE)将于9月中旬举行.已经报名的同学请利用暑期时间好好准备吧! > 2019年9月份最新二级题库看文末 ▼ 公众号内回复关键词:2305获取下载链接 考前学习 计算机二级考试方法为机考,时间为120分钟,分数100分.得60分以上则通过考试. || 好好打基础,温习知识点 不管是自学考

2019年12月ccf csp认证第三题-判断是否配平化学方程式

#include<bits/stdc++.h> using namespace std; int n; string s; void solve_son(queue<string>&q,int bei,map<string,int>&m) { while(!q.empty()) { string ts = q.front(); q.pop(); if(ts=="(") { int left = 1,right = 0; queue&l

2019年12月(2)

关于文化课 月考成绩出来了,窝年级540名,光荣成为信息组吊车尾. 好消息是,以前的老本被证明是有用的,除了语文和英语其他科目都在班上前十或者前五. 一个更重要的好消息是,在我和班主任的积极沟通下,班主任也支持我高考外语科目选考日语啦~~ 看来可以水很长一段时间的文化课啦 关于OI 这个星期把重点放在了图论知识的复习上,除了<挑战>上面的题目之外,还在洛谷上写了很多有关最短路,最小生成树的题目.还写了几个差分约束的题目,之前差分约束总是不清楚怎么连边,现在基本上搞清楚了. 时隔一个月,星期六上