史上最最最没用程序——自写平衡化学方程式

化学方程式小程序 自动配平化学方程式 阅读详情

前言

在几天前无意中看到了有这么一个 bce 库,能够平衡化学方程式系数,我就想着这不就是配配元素嘛,自己按看到的例子进行尝试,结果…
程序设计上越来越复杂,也不知道他那 bce-console.exe 仅仅 104KB 大小的程序怎么就能如此迅速配平化学方程(可能比较懒,所以像后面电子守恒和未知数关系的我就没有去研究如何做对应的解决方案)。

例子

>> P+O2=P2O5
4P+5O2=2P2O5
>> H2O(g)+Fe=Fe3O4+H2
4H2O(g)+3Fe=Fe3O4+4H2
>> CO+Fe2O3=Fe+CO2
3CO+Fe2O3=2Fe+3CO2
>> C2H5OH+O2=CO2+H2O
C2H5OH+3O2=2CO2+3H2O
>> Cl2+<e->=Cl<e->
Cl2+2<e->=2Cl<e->
>> Cu+Fe<3e+>=Cu<2e+>+Fe<2e+>
Cu+2Fe<3e+>=Cu<2e+>+2Fe<2e+>
>> LiOH+H2O2+H2O=Li2O2.H2O2.3H2O
2LiOH+2H2O2+H2O=Li2O2.H2O2.3H2O
>> C{n}H{2n+2}+O2=CO2+H2O
{(n+1)^(-1)}C{n}H{2*n+2}+{(1/2)*(3*n+1)/(n+1)}O2={n/(n+1)}CO2+H2O
>> CH3(CHCH){n}CH3+Cl2=CH3(CHClCHCl){n}CH3
CH3(CHCH){n}CH3+{n}Cl2=CH3(CHClCHCl){n}CH3
>> X-<e->=X<{n}e+>
X-{n}<e->=X<{n}e+>
>> CH4;HCN;NH3;O2;H2O
2HCN+6H2O=2CH4+2NH3+3O2
>> CH4(g);HCN(g);NH3(g);O2(g);H2O(g)
2CH4(g)+2NH3(g)+3O2(g)=2HCN(g)+6H2O(g)

运行截图

bce-console.exe运行结果(pip install bce安装)

在这里插入图片描述

总程序运行结果

在这里插入图片描述

需要的库

import re  # 正则表达式库,用于提取元素和数目
import string  # 获取所有空白字符,替换掉化学方程式中多余空白字符以防出现意外
from sympy import solve, symbols  # 用于解方程的库,solve是求解函数,symbols可以生成符号变量

步骤

这里采用等式左右两边所有化学元素数量种类守恒的方式来解决配平问题。

拆分等式左右侧

由于本文不考虑其他守恒规则,所以先过滤掉其他规则的化学方程式(最后只剩下例子的前4个)。
这里的 left 和 right 就是化学方程式等号左右两边的内容。

if '=' not in ChemicalEquations and ';' in ChemicalEquations:
    all_items = ChemicalEquations.split(';')
    pass  # 自动化合价计算等式先不做,先做元素配平
elif 'e+>' in ChemicalEquations or 'e->' in ChemicalEquations or '{' in ChemicalEquations or '.' in ChemicalEquations:
    pass  # 暂时不搞电子<e+>/<e->和含./{n}的化学物质等的运算
else:
    left, right = ChemicalEquations.split('=')

拆分每个化学物质和±号

化学物质组成

欲获得化学物质,首先得知道有哪些化学元素符号。
当然这边的化学物质是包括电子和未知数倍数关系提取的,所以很长。
这结果并不是完全只有化学物质,还包括了化学物质后的 ± 号,虽然没有电子参与一般都是 + 号。

1、倍数元素:\d|{[A-Za-z0-9+-]}
2、电荷元素:<(?:\d|{[A-Za-z0-9+-]})?e[+-]>
3、化学元素:[A-Z][a-z]?\.?
4、物质状态:\([gls]\)  # g是气体,l是液体,s是固体
5、化学物质:[+-]?(<(?:\d+|{[A-Za-z0-9+-]+})?e[+-]>|(?:(?:\(?(?:[A-Z][a-z]?\.?)+(?:\d+|{[A-Za-z0-9+-]+})?\)?)+(?:<(?:\d+|{[A-Za-z0-9+-]+})?e[+-]>)?)+)(?:\([gls]\))?([+-]?)
6、[②]物质:[+-]?(<(?:\d+|{[A-Za-z0-9+-]+})?e[+-]>|(?:[A-Za-z0-9.]+(?:\([A-Za-z0-9]+\))?(?:{[A-Za-z0-9+-]+})?(?:<(?:\d+|{[A-Za-z0-9+-]+})?e[+-]>)?)+)(?:\([gls]\))?([+-]?)

化学物质提取

left, right = ChemicalEquations.split('=')
items = re.compile(R'[+-]?(<(?:\d+|{[A-Za-z0-9+-]+})?e[+-]>|(?:(?:\(?(?:[A-Z][a-z]?\.?)+(?:\d+|{[A-Za-z0-9+-]+})?\)?)+(?:<(?:\d+|{[A-Za-z0-9+-]+})?e[+-]>)?)+)(?:\([gls]\))?([+-]?)')
left_items, right_items = items.findall(left), items.findall(right)

到这里所有化学物质和运算符 ± 就全部被提取出来了,如何用一行代码让他们从二层列表中脱出来到一层列表呢?用万能的匿名表达式就能实现

get_all = lambda _, __ = eval("[]"): __.clear() or [[__.append(____) for ____ in ___ if ____] for ___ in _] and __

这里为什么要用 __ = eval("[]") 而不用 __ = [] 或 __ = list() 呢?这里先简单的解释一下 python 是怎么帮我们把值赋给变量的:
python会把同一值所在地址赋值给变量,也就是说,两个不同变量名赋值同一值,他们的内存地址相同【id(XXX)相同】。所以这边如果赋值为空列表,那会干扰其他同时运行的空列表,所以使用空列表作为默认参数会有问题,解释器会报凸显的黄色,而使用 eval("[]") 计算出的列表就不会报黄警告,虽然这也是空列表,不过为了避免多次执行出现的变量意外,我在使用前执行了 list..clear() 来清空列表,这样最后得到的结果只会有后面执行的。然后 or 后面的列表并不是需要的结果,只是借助了列表施展列表推导式,在推导式中为列表变量添加值,最后用 and 变量将提取出元素的列表值传回去。

统计每个化学物质内每个化学元素的数量

判断等式双方元素种类是否一致

这里的 ELEMENT 是用来提取出所有化学元素包括电子的。
这里为什么不直接用 assert elements == right_elements 呢?因为列表是有序的,只要顺序不一样列表就不一样,这里只需要种类一致,所以采用集合相等,或集合反交集为空来判断两边元素种类是否一致。

ELEMENT = re.compile(R'([A-Z][a-z]?\.?|<(?:\d|{[A-Za-z0-9+-]})?e[+-]>)')
elements = list(set(get_all([ELEMENT.findall(item) for item in left_item_list if item not in list('+-')])))
right_elements = list(set(get_all([ELEMENT.findall(item) for item in right_item_list if item not in list('+-')])))
# assert not (set(elements) ^ set(right_elements)), '化学方程式两方元素不守恒!'
assert set(elements) == set(right_elements), '化学方程式两方元素不守恒!'

计算左右双方元素数量,获取每个元素在每个物质中的占比

接下来就是统计左右元素数量,scale_group 用于获取每个元素在不同物质中的数量,left_item_dict 和 right_item_dict 用于获取每个物质中每个元素的数量,先以物质键中获取元素数量,再反转以元素为键,获取元素在不同物质中的数量。

scale_group = {element: {} for element in elements}
left_item_dict = {item: {} for item in left_item_list if item not in list('+-')}
right_item_dict = {item: {} for item in right_item_list if item not in list('+-')}
for item_list, item_dict in ((left_item_list, left_item_dict), (right_item_list, right_item_dict)):
    for item in item_list:
        if item not in list('+-'):
            for element in re.compile(R'([A-Z][a-z]?)(\d*)').findall(item):
                if element[0] not in item_dict[item]:
                    item_dict[item][element[0]] = 0
                item_dict[item][element[0]] += element[1].isdigit() and int(element[1]) or 1
for element in elements:
    for item_dict in (left_item_dict, right_item_dict):
        for item in item_dict:
            if element in item:
                scale_group[element][item] = item_dict[item][element]

解化学元素守恒方程

按物质名称创建符号变量

symbols_list = symbols([item for item in (left_item_list + right_item_list) if item not in list('+-')], positive=True, integer=True, real=True)  # 为每个化学物质创建元素符号
for symbol in symbols_list:
    globals()[str(symbol)] = symbol  # 将符号变量释放到全局,为下文eval()字符串转变量算式做基础

根据左右元素总量关系创建关系式

关系为:每个元素中,左边元素数量之和 - 右边元素数量之和 = 0。
eval(temp_str) 是为了将字符串计算成符号变量方程

solve_list = []
for element in elements:
    temp_str = ''
    temp = []
    for item in left_item_dict:
        index = scale_group[element].get(str(item), 
        if index:
            temp.append(f'{index}*{str(item)}')
    temp_str += '+'.join(temp)
    temp = []
    for item in right_item_dict:
        index = scale_group[element].get(str(item), 
        if index:
            temp.append(f'{index}*{str(item)}')
    if temp:
        temp_str += '-' + '-'.join(temp)
    solve_list.append(eval(temp_str))

求解各个化学物质之间的比例关系

res 为各个化学物质系数之间比例关系的解:{其他化学物质:n * 某化学物质}。
can_zhao 为作为参照的化学物质,通过每个比例除以它得到纯数字比例,并将它设为1,就得到了他们之间的数字比例关系。
观察到一般 slove 求解的关系比例分子已经是最小公倍数,而且分母只会有一个数,所以此处将分母提取出来让所有比例数字乘以分母,得到最小公倍数系数比例组。

res = solve(solve_list, symbols_list)
can_zhao = [item for item in symbols_list if str(item) == list(set(list(left_item_dict.keys()) + list(right_item_dict.keys())) - set(list(map(str, res.keys()))))[0]][0]
for item in res:
    res[item] /= can_zhao
res[can_zhao] = 1
fen_mu = re.compile(R'/(\d+)?').findall(str(res))
if fen_mu:
    bs = int(fen_mu[0])
    for item in res:
        res[item] *= bs

取比例组最小公倍数为化学物质系数

生成配平的化学方程式,chemical_equations 就是需要的配平后的化学方程式

chemical_equations = []
for item_dict in (left_item_dict, right_item_dict):
    all_item = []
    all_index = []
    for item in item_dict:
        all_item.append(item)
        all_index.append(res[[i for i in symbols_list if str(i) == item][0]])
    chemical_equations.append(' + '.join([f'{"" if all_index[i] == 1 else all_index[i]}{all_item[i]}' for i in range(len(item_dict))]))
chemical_equations = ' = '.join(chemical_equations)

总代码

# _*_ coding:utf-8 _*_
# Project: 最最最没用程序合集
# FileName: AutoBalancingChemicalEquations.py
# UserName: user_from_future博主
# ComputerUser:user_from_future
# Day: 2022/2/21
# Time: 20:21
# IDE: PyCharm
# 2022年,所有bug都将会被丢到海里喂鲨鱼!我说的!不容反驳!

# 自动配平化学方程式
# import bce

import re
import string
from sympy import solve, symbols

"""
逻辑流程:
1、拆分等式左右侧
2、拆分每个化学物质和+-号
3、统计每个化学物质内每个化学元素的数量
4、解化学元素守恒方程
5、取比例组最小公倍数为化学物质系数
元素特征:
1、倍数元素:\d|{[A-Za-z0-9+-]}
2、电荷元素:<(?:\d|{[A-Za-z0-9+-]})?e[+-]>
3、化学元素:[A-Z][a-z]?\.?
4、物质状态:\([gls]\)  # g是气体,l是液体,s是固体
5、化学物质:[+-]?(<(?:\d+|{[A-Za-z0-9+-]+})?e[+-]>|(?:(?:\(?(?:[A-Z][a-z]?\.?)+(?:\d+|{[A-Za-z0-9+-]+})?\)?)+(?:<(?:\d+|{[A-Za-z0-9+-]+})?e[+-]>)?)+)(?:\([gls]\))?([+-]?)
6、[②]物质:[+-]?(<(?:\d+|{[A-Za-z0-9+-]+})?e[+-]>|(?:[A-Za-z0-9.]+(?:\([A-Za-z0-9]+\))?(?:{[A-Za-z0-9+-]+})?(?:<(?:\d+|{[A-Za-z0-9+-]+})?e[+-]>)?)+)(?:\([gls]\))?([+-]?)

试验过程:
>> P+O2=P2O5
4P+5O2=2P2O5
>> H2O(g)+Fe=Fe3O4+H2
4H2O(g)+3Fe=Fe3O4+4H2
>> CO+Fe2O3=Fe+CO2
3CO+Fe2O3=2Fe+3CO2
>> C2H5OH+O2=CO2+H2O
C2H5OH+3O2=2CO2+3H2O
>> Cl2+<e->=Cl<e->
Cl2+2<e->=2Cl<e->
>> Cu+Fe<3e+>=Cu<2e+>+Fe<2e+>
Cu+2Fe<3e+>=Cu<2e+>+2Fe<2e+>
>> LiOH+H2O2+H2O=Li2O2.H2O2.3H2O
2LiOH+2H2O2+H2O=Li2O2.H2O2.3H2O
>> C{n}H{2n+2}+O2=CO2+H2O
{(n+1)^(-1)}C{n}H{2*n+2}+{(1/2)*(3*n+1)/(n+1)}O2={n/(n+1)}CO2+H2O
>> CH3(CHCH){n}CH3+Cl2=CH3(CHClCHCl){n}CH3
CH3(CHCH){n}CH3+{n}Cl2=CH3(CHClCHCl){n}CH3
>> X-<e->=X<{n}e+>
X-{n}<e->=X<{n}e+>
>> CH4;HCN;NH3;O2;H2O
2HCN+6H2O=2CH4+2NH3+3O2
>> CH4(g);HCN(g);NH3(g);O2(g);H2O(g)
2CH4(g)+2NH3(g)+3O2(g)=2HCN(g)+6H2O(g)
"""

ChemicalEquationsList = [
    'P+O2=P2O5',                                # 4P+5O2+2P2O5
    'H2O(g)+Fe=Fe3O4+H2',                       # 4H2O(g)+3Fe=Fe3O4+4H2
    'CO+Fe2O3=Fe+CO2',                          # 3CO+Fe2O3=2Fe+3CO2
    'C2H5OH+O2=CO2+H2O',                        # C2H5OH+3O2=2CO2+3H2O
    'Cl2+<e->=Cl<e->',                          # Cl2+2<e->=2Cl<e->
    'Cu+Fe<3e+>=Cu<2e+>+Fe<2e+>',               # Cu+2Fe<3e+>=Cu<2e+>+2Fe<2e+>
    'LiOH+H2O2+H2O=Li2O2.H2O2.3H2O',            # 2LiOH+2H2O2+H2O=Li2O2.H2O2.3H2O
    'C{n}H{2n+2}+O2=CO2+H2O',                   # {(n+1)^(-1)}C{n}H{2*n+2}+{(1/2)*(3*n+1)/(n+1)}O2={n/(n+1)}CO2+H2O
    'CH3(CHCH){n}CH3+Cl2=CH3(CHClCHCl){n}CH3',  # CH3(CHCH){n}CH3+{n}Cl2=CH3(CHClCHCl){n}CH3
    'X-<e->=X<{n}e+>',                          # X-{n}<e->=X<{n}e+>
    'CH4;HCN;NH3;O2;H2O',                       # 2HCN+6H2O=2CH4+2NH3+3O2
    'CH4(g);HCN(g);NH3(g);O2(g);H2O(g)',        # 2CH4(g)+2NH3(g)+3O2(g)=2HCN(g)+6H2O(g)
]


ELEMENT = re.compile(R'([A-Z][a-z]?|<(?:\d|{[A-Za-z0-9+-]})?e[+-]>)')


def max_gys(num1, num2):  # 两个数最大公约数
    while num2:
        temp = num1 % num2
        num1, num2 = num2, temp
    return num1


def min_gbs(num1, num2):  # 两个数最小公倍数
    return num1 * num2 // max_gys(num1, num2)


# 将二层列表中的内容转成一层列表
get_all = lambda _, __ = eval("[]"): __.clear() or [[__.append(____) for ____ in ___ if ____] for ___ in _] and __


def handle_double_elements_list_scale(element1, element2, chemicals, scale_group):  # 同步两个元素组中相同的元素
    shared = list(set(chemicals[element1]) & set(chemicals[element2]))
    if shared:
        multiply = min_gbs(scale_group[element1][shared[0]], scale_group[element2][shared[0]])
        shared1 = scale_group[element1][shared[0]]
        for item in scale_group[element1]:
            scale_group[element1][item] *= (multiply // shared1)
        shared2 = scale_group[element2][shared[0]]
        for item in scale_group[element2]:
            scale_group[element2][item] *= (multiply // shared2)
    return element2


def calc_equations(left_item_list, right_item_list):
    elements = list(set(get_all([ELEMENT.findall(item) for item in left_item_list if item not in list('+-')])))
    right_elements = list(set(get_all([ELEMENT.findall(item) for item in right_item_list if item not in list('+-')])))
    assert set(elements) == set(right_elements), '化学方程式两方元素不守恒!'
    symbols_list = symbols([item for item in (left_item_list + right_item_list) if item not in list('+-')], positive=True, integer=True, real=True)  # 为每个化学物质创建元素符号
    for symbol in symbols_list:
        globals()[str(symbol)] = symbol  # 将符号变量释放到全局,为下文eval()字符串转变量算式做基础
    scale_group = {element: {} for element in elements}
    left_item_dict = {item: {} for item in left_item_list if item not in list('+-')}
    right_item_dict = {item: {} for item in right_item_list if item not in list('+-')}
    for item_list, item_dict in ((left_item_list, left_item_dict), (right_item_list, right_item_dict)):
        for item in item_list:
            if item not in list('+-'):
                for element in re.compile(R'([A-Z][a-z]?)(\d*)').findall(item):
                    if element[0] not in item_dict[item]:
                        item_dict[item][element[0]] = 0
                    item_dict[item][element[0]] += element[1].isdigit() and int(element[1]) or 1
    for element in elements:
        for item_dict in (left_item_dict, right_item_dict):
            for item in item_dict:
                if element in item:
                    scale_group[element][item] = item_dict[item][element]
    solve_list = []
    for element in elements:
        temp_str = ''
        temp = []
        for item in left_item_dict:
            index = scale_group[element].get(str(item), "")
            if index:
                temp.append(f'{index}*{str(item)}')
        temp_str += '+'.join(temp)
        temp = []
        for item in right_item_dict:
            index = scale_group[element].get(str(item), "")
            if index:
                temp.append(f'{index}*{str(item)}')
        if temp:
            temp_str += '-' + '-'.join(temp)
        solve_list.append(eval(temp_str))
    res = solve(solve_list, symbols_list)
    can_zhao = [item for item in symbols_list if str(item) == list(set(list(left_item_dict.keys()) + list(right_item_dict.keys())) - set(list(map(str, res.keys()))))[0]][0]
    for item in res:
        res[item] /= can_zhao
    res[can_zhao] = 1
    fen_mu = re.compile(R'/(\d+)?').findall(str(res))
    if fen_mu:
        bs = int(fen_mu[0])
        for item in res:
            res[item] *= bs
    chemical_equations = []
    for item_dict in (left_item_dict, right_item_dict):
        all_item = []
        all_index = []
        for item in item_dict:
            all_item.append(item)
            all_index.append(res[[i for i in symbols_list if str(i) == item][0]])
        chemical_equations.append(' + '.join([f'{"" if all_index[i] == 1 else all_index[i]}{all_item[i]}' for i in range(len(item_dict))]))
    chemical_equations = ' = '.join(chemical_equations)
    return chemical_equations


for ChemicalEquations in ChemicalEquationsList:
    for space in string.whitespace:
        ChemicalEquations = ChemicalEquations.replace(space, '')
    if '=' not in ChemicalEquations and ';' in ChemicalEquations:
        all_items = ChemicalEquations.split(';')
        pass  # 自动化合价计算等式先不做,先做元素配平
    elif 'e+>' in ChemicalEquations or 'e->' in ChemicalEquations or '{' in ChemicalEquations or '.' in ChemicalEquations:
        pass  # 暂时不搞电子<e+>/<e->和含./{n}的化学物质等的运算
    else:
        left, right = ChemicalEquations.split('=')
        items = re.compile(R'[+-]?(<(?:\d+|{[A-Za-z0-9+-]+})?e[+-]>|(?:(?:\(?(?:[A-Z][a-z]?\.?)+(?:\d+|{[A-Za-z0-9+-]+})?\)?)+(?:<(?:\d+|{[A-Za-z0-9+-]+})?e[+-]>)?)+)(?:\([gls]\))?([+-]?)')
        left_items, right_items = items.findall(left), items.findall(right)
        print(ChemicalEquations + '\n\t' + calc_equations(list(get_all(left_items)), list(get_all(right_items))))

结束语

当然了,我这个只能解决没有电子转移和没有未知数关系的方程式,剩余的比较懒没想做,有兴趣的可以完善我这个程序哦~
想要标准的化学方程式配平结果,请安装 bce 库,使用 bce-console.exe 程序求解配平。
几天后可能就要手术去了,届时我将不能及时回复各个评论。作为第一个也是最后一个不正紧的打算,就像这样随意尝试一下,最后得出结论:程序员还是搬运代码来的香~ (前人的知识就是现人的工具)

CSP 化学方程式 100分题解 思路分析 这道题的题目较之前有了一些减短,不过还是一样的有些麻烦。基本思路就是检验方程式两边的元素是否已经配平,所以去找元素和其对应的个数就可以了,接下来就是程序设计问题了。 代码 #include <iostream> #include <vector> #include <algorithm> #include <map> #include &l... 阅读详情

相关推荐

CCF-CSP真题《201912-3 化学方程式》java满分题解

【代码】CCF-CSP真题《201912-3 化学方程式》java满分题解。

m0_64388161的博客 294

Python torch.nn 模块,BCELoss() 实例源码

Python torch.nn 模块,BCELoss() 实例源码 https://www.codingdict.com/sources/py/torch.nn/8356.html (七)详解pytorch中的交叉熵损失函数nn.BCELoss()、nn.BCELossWithLogits(),二分类任务如何定义损失函数,如何计算准确率、如何预测 https://www.cnblogs.com/zhangxianrong/p/14773075.html ...

weixin_42185501的博客 1275

CCF计算机软件能力认证试题练习:201912-3 化学方程式

化学方程式 来源:CCF 标签: 参考资料: 相似题目: 题目 化学方程式,也称为化学反应方程式,是用化学式表示化学反应的式子。给出一组化学方程式,请你编写程序判断每个方程式是否配平(也就是方程式中等号左右两边的元素种类和对应的原子个数是否相同)。 本题给出的化学方程式由大小写字母、数字和符号(包括等号=、加号+、左圆括号和右圆括号)组成,不会出现其他字符(包括空白字符,如空格、制表符等),...

WINGREZ‘S BLOG 1万+

方程思想应用于化学方程式配平

序言 化学方程式的配平是初高中化学中的一个基础,对于一般的化学方程式用初高中的各种方法,诸如观察法,得失电子守恒法,奇偶配平法,最小公倍数法等等。这些方法在简单的方程式,至少初高中学的都是够用的,但是设计到很复杂的化学方程式就显得有点难办了。本文提出了一种基于质量守恒原理,采用数学方法结合来配平化学方程式的方法。 方法讲解 废话不多说我们直接上例子: 例1酒精在空气中燃烧:C2H5O...

springcoder的博客 1994

化学方程式配平计算器_Delphi控件源码_Pascal

本文还有配套的精品资源,点击获取 简介:这个压缩文件包含了用Pascal语言编写的Delphi控件源码,专门用于构建一个化学方程式配平计算器。Delphi是一种基于Pascal的对象导向编程工具,常用于开发桌面应用程序。此项目旨在帮助用户理解并解决化学方程式的平衡问题,提供了一个用户界面组件的原始代码,这些组件包括按钮、文本框和列表视图等,它们是用Pascal语言编写的,能...

weixin_32869687的博客 1208

自动配平化学反应方程式程序

中学化学反应方程式自动配平的程序。中学生化学课学习资源。16位程序,可在Dos, Dosbox,WinXP 系统使用。

化学方程式配平

这是个很可爱的东西~ 我们把方程式中的每个元素的个数提出来,就可以列方程了。 没错,因为方程是无数解的,所以我们把一个值设为1,然后用分数存答案,最后算最小公倍数。 所以我们用到了分数类。 然后: #include&amp;amp;lt;cstdio&amp;amp;gt; #include&amp;amp;lt;iostream&amp;amp;gt; #include&amp;amp;lt;cstring&amp;amp;gt; #defi

cdy1206473601的博客 2380

【迁移学习综述】

迁移学习的目标是将某个领域或任务上学习到的知识应用到不同的但相关的领域或问题中。迁移学习的研究来源于一个观测:人类可以将以前的学到的知识应用于解决新的问题,更快的解决问题或取得更好的效果。迁移学习被赋予这样一个任务:从以前的任务当中去学习知识(knowledge)或经验,并应用于新的任务当中。换句话说,迁移学习目的是从一个或多个源任务(source tasks)中抽取知识、经验,然后应用于一个目标领域(target domain)当中去。

afadgas的博客 4321

ccf 化学方程式 python 满分

![在这里插入图片描述](https://img-blog.csdnimg.cn/20201216104116643.png?x-oss-process=image/waterma 样例输入: 11 H2+O2=H2O 2H2+O2=2H2O H2+Cl2=2NaCl H2+Cl2=2HCl CH4+2O2=CO2+2H2O CaCl2+2AgNO3=Ca(NO3)2+2AgCl 3Ba(OH)2+2H3PO4=6H2O+Ba3(PO4)2 3Ba(OH)2+2H3PO4=Ba3(PO4)2+6H2O 4Z

weixin_44423317的博客 539

基于人脸识别的驾驶员疲劳检测方法研究

摘 要交通安全问题愈发严重,疲劳驾驶已是造成交通事故的主要因素之一。为减少因疲劳驾驶造成的交通事故,本文设计了一种基于图像处理技术的疲劳驾驶监测系统,该系统结合了肤色模型、灰度积分投影技术以及PERCLOS方法,旨在通过实时视频图像分析准确检测驾驶员的疲劳状态。首先,系统通过肤色模型从图像中有效提取人脸区域,并在此基础上利用Haar级联分类器进行人脸检测,确保在人脸角度变化或部分遮挡的情况下依然能够实现高效识别。接着,灰度积分投影技术被应用于眼部定位,通过分析眼睛区域的灰度变化,精确确定眼睛的上下边界,从

carrott0617的博客 1005

深度解读扫地机器人的导航原理

科技改变生活,不可否认科技的进步的确为我们的生活带来许多便捷,以智能家电为例,智能电饭煲、智能洗碗机、智能扫地机等产品已逐渐成为家庭的一分子,其中以扫地机表现最为抢眼。能做到智能规划清扫,收割了不少家庭主妇及科技爱好者的芳心。但扫地机并非一开始就这么智能,最初的扫地机只能做到随机式清扫,会频繁出现碰撞现象。 近年来,通过业界的不断努力,目前,扫地机器人已告别乱碰乱撞现象,能做到自主路径...

qq_38403231的博客 6506

CCF认证 201912-3 《化学方程式》

配平的意思为 方程式两边的化学元素的种类和对应的数量相同 算法思路 1、字符串分割 例如 H2+O2=H2O 分割为 H2 O2 H2O CH4+2O2=CO2+2H2O 分割为CH4 2O2 CO2 2H2O 分割符为 +、= 本题目中只有一个=,可能有多个+,并且=将化学方程式分成两部分。 写出一个方法,完成字符串分割 void split(string str,vector<strin...

冰冻三尺非一日之寒 2606

GT911触摸驱动避坑指南:从寄存器读取到多点触控处理的5个关键步骤详解

本文深入解析了GT911触摸驱动开发中的关键步骤与常见问题。从硬件初始化、I2C通信建立,到核心寄存器操作、缓冲区状态管理,再到配置表烧录与多点触控数据解析,提供了详尽的避坑指南。文章结合STM32等平台的实战代码,重点阐述了驱动调试中的时序、中断处理和坐标映射等核心要点,帮助开发者高效实现稳定可靠的多点触控功能。

weixin_29189363的博客 676

CCF201912-3 化学方程式(100分)【文本处理】

试题编号: 201912-3 试题名称: 化学方程式 时间限制: 1.0s 内存限制: 512.0MB 问题链接:CCF201912-3 化学方程式 问题简述:(略) 问题分析:文本处理问题,按字符串来处理即可,顺序处理,递归都不需要。 程序说明:(略) 参考链接:(略) 题记:(略) 100分的C++语言程序如下: /* CCF201912-3 化学方程式 */ #include <bits/stdc++.h> using namespace std; struct Elem {

海岛Blog 1999

针对小缺陷目标:在YOLOv11中引入小目标检测层

摘要: 针对YOLOv11在工业检测中漏检微小目标(如焊点气泡)的问题,研究发现深层特征下采样导致小目标信息丢失。通过在YOLOv11中增加P2检测层(4倍下采样)并融合浅层高分辨率特征,可显著提升小目标召回率。关键优化包括:调整模型结构、谨慎设计数据增强策略(减少MixUp、增加小目标粘贴)、重新分配损失权重(提升P2层权重)、优化推理速度(动态分辨率、通道裁剪)。同时强调数据质量的重要性,建议根据具体场景特性(目标尺寸、分布)定制方案,而非盲目调整模型。

as1225120794的博客 366

YOLOv8改进 | 主干网络 | 将主干网络替换为轻量化的ShuffleNetv2【原理 + 完整代码】

yolov8,yolov8创新,yolov8改进

kay_545 2566

PTA Easy chemistry 化学方程式等价判定 string 状态机

7-5 Easy chemistry In this question, you need to write a simple program to determine if the given chemical equation is balanced. Balanced means that the amount of elements on both sides of the “=” sign is the same. H​2​​O+CO​2​​=H​2​​CO​3​​H​2​​O+CO​2​​=H​

马角的逆袭的博客 399

【DRAM存储器六十六】DDR5介绍--训练相关之CA/CS Training

详述DDR5 CA/CS training过程细节

highman110的博客 200

CSP201912-3 化学方程式

CSP201912-3 化学方程式 题目描述 题目分析 题目要求判断配平,即统计每种元素的数量,且涉及处理括号的问题。而化学方程式最长可以达到1000字符,基本应当把程序时间复杂度限制到线性阶才比较稳妥,那么处理括号必然用到栈(递归次数超过10万好像会爆掉): while() { do { Expr; } while(!stack.empty()) } 下面仔细分析化学方程式 (e...

weixin_43227599的博客 912

我的GIT练习ONE

Git 是一个分布式版本控制及源代码管理工具;Git 可以为你的项目保存若干快照,以此来对整个项目进行版本管理每一次的练习,都是对自身知识的巩固,以及对自身知识的一个测试。

是个非常热爱生活、乐观、奋斗、努力的逗比青年 8872

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

ccf-csp 201912-3 化学方程式

ccf-csp 201912-3 化学方程式 第一次做好吃力,学完编译原理之后感觉豁然开朗 ???? 严格按照题中所给的BNF形式化定义来写代码,如下图 当然其中一些比较小的东西(比如uppercase,lowercase之类的),直接检测了吧,其他的一个一个编写函数来匹配,就是递归下降法的思路,下面是代码部分,看函数名应该很好懂,元素和元素的个数我使用map存的,一是检索起来方便,而是字符串有序,比较起来方便(从头到尾比较,依次比较元素名和元素个数) #include<iostream>

panfengblog 405

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

【C++ | PTA】Easy chemistry

在这道题目中,你需要编写一个简单的程序来判断给定的化学方程式是否平衡。平衡指的是等号两侧所含各元素的数量相等。对于每个测试用例,如果其对应的化学方程式平衡,则输出 “Easy!”,否则输出 “Hard!保证 S 只包含大写字母、小写字母、等号和加号,所有元素数量之和不会超过。接下来有 T 行,每行包含一个字符串 S。第一行包含一个整数 T。,表示测试用例的数量。,表示一个化学方程式。

等风来 5674

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

python程序案例 化学-(CSP)201912-3化学方程式-python实现

测试数据11H2+O2=H2O2H2+O2=2H2OH2+Cl2=2NaClH2+Cl2=2HClCH4+2O2=CO2+2H2OCaCl2+2AgNO3=Ca(NO3)2+2AgCl3Ba(OH)2+2H3PO4=6H2O+Ba3(PO4)23Ba(OH)2+2H3PO4=Ba3(PO4)2+6H2O4Zn+10HNO3=4Zn(NO3)2+NH4NO3+3H2O4Au+8NaCN+2H2O+O...

weixin_39856265的博客 939

用Python写一行代码,不使用第三方库配平化学方程式

您可以使用 Python 内置的字符串操作来配平化学方程式。 例如,假设您想要配平下面的化学方程式: 2 H2 + O2 -> 2 H2O 您可以使用 Python 代码如下来计算需要的修正系数: ``` reactants = "2 H2 + O2" products = "2 H2O" 将字符串转换为列表 reactants_list = reactants.split(" + ") p...

weixin_42600407的博客 205

csp2019-12化学方程式

思路:将每个方程式进行切割出每个分子 CaCl2+2AgNO3=Ca(NO3)2+2AgCl 拆出 CaCl2,2AgNO3,Ca(NO3)2,2AgCl 进一步去除系数拆出CaCl2,AgNO3,Ca(NO3)2,AgCl 分别计算各个分子各原子数量,然后乘以系数 最后判断等式左右原子数量是否相同 #include<bits/stdc++.h> using namespace std; string tmp[1005],s; bool isbig(char c){ return (c>.

naiue的博客 380
上一篇: Python进阶——对Python“脚本”的理解与使用
下一篇: 对旧博客反爬指导文章部分更新说明
user_from_future
博客等级 码龄5年 4067粉丝 115原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值