/*Chemical Equation Balancer

HiJ1m 2017.10.6*/#include

using namespacestd;

inlineint gcd(int x,inty){return x%y==0?y:gcd(y,x%y);

}

inlineint lcm(int x,inty){return x*y/gcd(x,y);

}struct frac{ //分数类

inta,b;voidreduce(){int x=gcd(a,b);

a/=x,b/=x;

};

fracoperator = (intx){

a=x,b=1;return *this;

};

fracoperator = (constfrac x){

a=x.a,b=x.b;

reduce();return *this;

};

fracoperator + (constfrac x){return (frac){b*x.a+a*x.b,b*x.b};

};

fracoperator - (constfrac x){return (frac){a*x.b-b*x.a,b*x.b};

};

fracoperator * (constfrac x){return (frac){a*x.a,b*x.b};

};

fracoperator / (constfrac x){return (frac){a*x.b,b*x.a};

};bool operator < (constfrac x){return a*x.b

};bool operator == (constfrac x){return a*x.b==b*x.a;

};voidprint(){if(b==1)printf("%d\n",a);else printf("%d/%d\n",a,b);

};

};

inline frac Abs(frac x){int p=x.a>0?x.a:-x.a,q=x.b>0?x.b:-x.b;return(frac){p,q};

}char s[55];int fun[55][55];int Map[27][27]; //手动MAP

frac M[55][55]; //求解矩阵

frac ans[55]; //解

int Ans[55]; //整数解

int cnt,c1,c2,flag=1,N,K; //cnt数元素,c1数反应物,c2总数 (未知数的数量)

char mat[55][55]; //存储物质的名称

voidprint(){

printf("%d %d\n",N,K);for(int i=1;i<=K;i++){for(int j=1;j<=N+1;j++)

printf("%d",M[i][j].a);

printf("\n");

}

printf("\n");

}

inlineint getint(int pos){ //读数

pos++;if(s[pos]>='a'&&s[pos]<='z')pos++;if(s[pos]'9')return 1; //没数就是1

else{int x=0;while(s[pos]>='0'&&s[pos]<='9')x=x*10+s[pos]-'0',pos++; //读元素后面的数字

returnx;

}

}

inlinevoid scan(int l,int r){ //处理物质

c2++;for(int i=0;i<=r-l;i++)mat[c2][i]=s[l+i]; //存下元素的名字

if(flag==1)c1++; //统计一下反应物数量

int tmp=1; //tmp是小括号倍数

for(int i=l;i<=r;i++){if(s[i]==')')tmp=1;if(s[i]=='('){int j=i+1;while(s[j]!=')')j++; //找这个括号的范围

tmp=getint(j); //读")"右边的数字

}if(s[i]>='A'&&s[i]<='Z'){ //发现元素

int x=s[i]-'A'+1,y=0;if(s[i+1]>='a'&&s[i]<='z') //看一眼是一个字母的还是两个的

y=s[i+1]-'a'+1;if(!Map[x][y])Map[x][y]=++cnt; //判重

fun[Map[x][y]][c2]+=flag*getint(i)*tmp; //把这个物质里的这种元素数量放进矩阵里,坐标(map[x][y],c2)

}

}

}

inlinebool Solve(){ //解方程 (矩阵 高cnt,宽c2+1,c2+1列常数全0)

ans[c2]=1; //令最后一个解为1

for(int i=1;i<=cnt;i++){for(int j=1;j<=c2;j++)

M[i][j]=fun[i][j];

}for(int i=1;i<=cnt;i++)

M[i][c2].a=-M[i][c2].a; //移到常数//高斯消元过程

N=c2-1,K=cnt;for(int k=1;k<=N;k++){

frac maxm=(frac){-1,1};intmaxi;for(int i=k;i<=K;i++)if(maxm

maxm=Abs(M[i][k]),maxi=i;if(maxm==(frac){0,1})return false;if(maxi!=k)for(int j=1;j<=N+1;j++){

swap(M[k][j],M[maxi][j]);

}

frac tmp=M[k][k];for(int j=1;j<=N+1;j++)

M[k][j]=M[k][j]/tmp;for(int i=k-1?1:2;i<=K;i++){if(i==k)continue;

frac tmp=M[i][k];for(int j=1;j<=N+1;j++)

M[i][j]=M[i][j]-tmp*M[k][j];

}

}return true;

}intmain()

{//printf("Chemical Equation Balancer\n");//printf("\nEnter the chemical equation:\n");

scanf("%s",s);int lst=0;for(int i=1;i

}if(Solve())for(int i=1;i<=c2-1;i++)

ans[i]=M[i][N+1];else printf("No Solution");int tmp=lcm(ans[1].b,ans[2].b);for(int i=3;i<=c2;i++)tmp=lcm(tmp,ans[i].b);for(int i=1;i<=c2;i++)Ans[i]=ans[i].a*tmp/ans[i].b; //取分母Lcm,把分数变整数

for(int i=1;i<=c2;i++)

{if(Ans[i]>1)printf("%d",Ans[i]);for(int j=0;j

printf("%c",mat[i][j]);if(i==c2)return 0;else if(i==c1)printf("=");else printf("+");

}

}

python化学公式配平_配平化学方程式的C++代码实现相关推荐

  1. python化学公式_(CSP)201912-3化学方程式-python实现

    测试数据 11 H2+O2=H2O 2H2+O2=2H2O H2+Cl2=2NaCl H2+Cl2=2HCl CH4+2O2=CO2+2H2O CaCl2+2AgNO3=Ca(NO3)2+2AgCl ...

  2. python语言公式求圆周率_通过Python实现圆周率的计算(公式方法和蒙特卡罗方法)...

    1.通过公式计算圆周率 当k正无穷 π=[1/16^k*(4/(8*k+1)-2/(8*k+4)- 1/(8*k+5)-1/(8*k+6))] 实现如下 #cal pi = 0 N = 100 for ...

  3. python泊松分布公式和期望_当λ很大时泊松分布如何计算?

    用Python计算: import math from scipy import stats #调用函数直接计算 p = stats.poisson.pmf(200, 300) print(" ...

  4. python泊松分布公式和期望_概率算法_二项分布和泊松分布

    本次函数有 1.阶乘 2.计算组合数C(n,x) 3.二项概率分布 4.泊松分布 以下是历史函数 ---------------以上是旧的------------------------------- ...

  5. python下载文件并改名_第46p,8行代码,用Python批量重命名文件

    大家好,我是杨数Tos,这是<从零基础到大神>系列课程的第46篇文章,第二阶段的课程:Python基础知识:小案例之用Python批量重命名文件. 学习本课程,建议先看一遍:[计算机基础知 ...

  6. python运势预测程序_星座运势查询示例代码

    #!/usr/bin/python # encoding:utf-8 import urllib2, json, urllib # 2.星座运势查询 data = {} data["appk ...

  7. 用python根据生日判断星座_求指教,我这个 代码是实现 根据生日判断星座

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 都是用正则匹配用户输入.有没有大佬可以帮忙简化下 # Author:Gwb # -*- coding: UTF-8 -*- ''' @ 功能:根据生日判断 ...

  8. python 的emulate函数封装_用模拟执行实现Objective-C代码自动化分析

    火眼高级逆向工程实验室脚本系列:用模拟执行实现Objective-C代码自动化分析 写在前面的话 京东安全开源的 qiling 是一个很不错的想法,但是唯一的问题在于它实现的东西太多,比较笨重.有的时 ...

  9. python run什么都没有_求助大佬问题:运行代码之后什么都没有显示什么情况?...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 from PyQt5 import QtCore, QtGui, QtWidgets from PyQt5.QtWidgets import * from ...

  10. python如何回到指定行_如何跳回特定的代码行(Python)

    我刚拿出一些旧代码,但我很想知道如何跳回特定的代码行.我的意思是,如果有一个if语句,它将执行某些操作,除非另有说明,无论如何,我要做的是当if语句结束时,或者当我到达else位时,我希望代码不再从头 ...

最新文章

  1. 4固定在底部_自建房不搭彩钢棚,4根钢结构撑个玻璃棚遮风挡雨,上面多个露台...
  2. 元宇宙iwemeta:元宇宙催生新的行业机会,看看你能抓住哪些机遇?
  3. [OS复习]设备管理2
  4. SQLyog连接虚拟机中docker中的mysql过程详解,并解决2003错误
  5. android xml 解析天气,Retrofit2解析天气API XML接口
  6. 【图嵌入】Graph Embedding 方法之 LINE 原理解读
  7. java mouselistener,Java MouseListener接口
  8. Linux运维 第三阶段 (五) DNS(主从,rndc远程控制,子域授权,视图,压力测试)
  9. c#的const可以用于引用类型吗
  10. pyside2 镜像安装_简单安装Pyside2
  11. c/c++语言实现登陆界面
  12. 传统形态抗锯齿 2.0
  13. 织梦登陆总是提示验证码错误
  14. 雅俗共赏——广告词之很美很强大的汉语言
  15. 高登数学,线性代数问题的数值解(SciPy第三方库,近似解)
  16. 转:领导者能够坦诚错误,员工就能畅所欲言
  17. IPS、VA、TN屏构造和优缺点对比
  18. msg文件转成html文件,如何将MSG格式的文件转换为PDF格式文件?
  19. 【1011】甲流疫情死亡率
  20. json能传数字,不能传字符串

热门文章

  1. 【金融财经】金融市场一周简报(2017-08-25)
  2. 解决Android手机人民币符号¥只显示一横的方法
  3. 利用python将微信聊天记录生成词云
  4. mysql在财务分析中的作用_财务报表分析的作用和目的
  5. Altium Designer -- 精心总结
  6. 中学计算机课小课题,【信息技术课题研究方案】 信息技术小课题研究题目大全_信息技术课题研究题目_信息技术课题研究_东城教研...
  7. 搭建以图搜图检索系统
  8. 三维重建:基于RGB-D相机的三维重建总览(静态动态)
  9. pq分解法matlab编程,基于matlab的pq分解法电力系统潮流计算.pdf
  10. Load Switch负载开关详解