[WIKIOI1975]化学方程式(字符串处理+线性方程组)

化学方程式是个很烦人的东西, 不仅背起来很麻烦, 连配平都是很麻烦的事情.

举例说, 铜和浓硝酸生成硝酸铜, 水和二氧化氮. 铜的化学式是Cu, 硝酸是HNO3, 硝酸铜是Cu(NO3)2, 二氧化氮是NO2, 水是H2O.

则这个式子简单写起来就是Cu+HNO3→Cu(NO3)2+NO2↑+H2O.

但是仔细观察可以看到, 硝酸根在反应前只有一个, 但是反应后却出现了两个, 而且反应前氢原子只有一个, 而反应后氢原子却有两个. 所以为了客观描述, 我们需要在两侧加上系数, 使得反应前后原子总数不变.

加上系数之后是Cu+4HNO3=Cu(NO3)2+2NO2↑+2H2O.

这个算是个比较好配平的式子, 如果若是铜和稀硝酸呢? 已知铜和稀硝酸生成硝酸铜, 水和一氧化氮. 铜的化学式是Cu, 硝酸是HNO3, 硝酸铜是Cu(NO3)2, 一氧化氮是NO, 水是H2O. 未配平就是Cu+HNO3→Cu(NO3)2+NO↑+H2O.

然后配平之后就是3Cu+8HNO3=3Cu(NO3)2+2NO↑+4H2O.

现在请你给一个化学方程式进行配平, 如果无法配平, 请输出“Error”.

注意, 一个方程式有无限种配平的可能性, 要求输出时全部系数的最小公因数为1.

题目保证有机化合物会写成最简式, 例如乙醇不会写成C2H5OH而会写成C2H6O, 但是像碱式碳酸铜依然会写成Cu2CO3(OH)2而不会合并为Cu2CH2O5. 即原子团不会被拆开.

    第1行为2个正整数NRea和NPro, 表示反应物的种类数和生成物的种类数.

    第2~NRea+1行每行包含1个字符串. 第i行表示每种反应物的化学式Reai, 其中只可能包含大写或者小写英文字母, 括号和数字. 保证第一个字符一定是字母, 如果某个元素代表的字母后面包括一个数字则表示有该数字个的该元素, 如果括号后面出现数字则表示该离子团或者官能团有该字母个.

    第NRea+2~NRea+NPro+1行行每行包含有1个字符串. 第i行的字符串表示该生成物的化学式Proi.

    1个完整的字符串, 代表化学方程式, 无需添加反应条件, 中间使用西文半角等号. 中间的各个物质按照输入顺序输出.

【输入样例1】
2 3
Cu
HNO3
Cu(NO3)2
NO
H2O
【输入样例2】
4 3
H2S
K2Cr2O7
H2SO4
Cr2(SO4)3
K2SO4
S
H2O
【输入样例3】
1 2
H2O2
H2O
H2
【输入样例4】
1 3
KMnO4
K2MnO4
MnO2
O2

【输出样例1】
3Cu+8HNO3=3Cu(NO3)2+2NO+4H2O
【输出样例2】
3H2S+K2Cr2O7+4H2SO4=Cr2(SO4)3+K2SO4+3S+7H2O
【输出样例3】
Error
【输出样例4】
2KMnO4=K2MnO4+MnO2+O2

1≤NRea, NPro≤100; 1≤Length(Reai)≤20.
题目不保证数据中的化学反应一定可以发生或者符合客观事实.
题目中涉及的化学元素有:
H, He, Li, Be, B, C, N, O, F, Ne, Na, Mg, Al, Si, P, S, Cl, Ar, K, Ca, 
Sc, Ti, V, Cr, Mn, Fe, Co, Ni, Cu, Zn, Ga, Ge, As, Se, Br, Kr, Rb, Sr, Y, Zr, 
Nb, Mo, Tc, Ru, Rh, Pd, Ag, Cd, In, Sn, Sb, Te, I, Xe, Cs, Ba, La, Ce, Pr, Nd, 
Pm, Sm, Eu, Gd, Tb, Dy, Ho, Er, Tm, Yb, Lu, Hf, Ta, W, Re, Os, Ir, Pt, Au, Hg, 
Tl, Pb, Bi, Po, At, Rn, Fr, Ra, Ac, Th, Pa, U, Np, Pu, Am, Cm, Bk, Cf, Es, Fm, 
Md, No, Lr, Rf, Db, Sg, Bh, Hs, Mt, Ds, Rg, Cn.


还没AC, 不过快了, 这道题就是烦.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的 C++ 实现,用于从用户输入线性方程组字符串中提取增广矩阵: ```cpp #include <iostream> #include <string> #include <vector> #include <sstream> using namespace std; int main() { string input; // 存储用户输入线性方程组字符串 cout << "请输入线性方程组,每个方程用逗号分隔,方程中的系数用空格分隔:" << endl; getline(cin, input); vector<vector<double>> augmentedMatrix; // 存储增广矩阵的二维向量 stringstream ss(input); // 将输入字符串转化为字符流 string equation; // 存储每个方程字符串 while (getline(ss, equation, ',')) { // 逐行读取方程 vector<double> coefficients; // 存储每个方程中的系数 stringstream eq(equation); // 将方程字符串转化为字符流 double coefficient; while (eq >> coefficient) { // 逐个读取系数 coefficients.push_back(coefficient); } augmentedMatrix.push_back(coefficients); // 将系数添加到增广矩阵中 } cout << "增广矩阵为:" << endl; for (int i = 0; i < augmentedMatrix.size(); i++) { for (int j = 0; j < augmentedMatrix[i].size(); j++) { cout << augmentedMatrix[i][j] << " "; } cout << endl; } return 0; } ``` 这段代码首先要求用户输入线性方程组字符串,然后创建一个二维向量来存储增广矩阵。它使用 stringstream 将输入字符串转换为字符流,并逐行读取方程。对于每个方程,它将系数存储在一个 vector 中,并将该 vector 添加到增广矩阵中。最后,它遍历增广矩阵并输出其值。 请注意,这只是一个简单的实现,可能无法处理所有情况。例如,它假设用户按照正确的格式输入线性方程组。在实际应用中,您可能需要添加更多的错误检查和边界条件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值