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

该博客介绍了一个用于平衡化学方程式的C++代码实现。程序通过高斯消元法解决线性方程组来找到各元素的系数,确保反应物和生成物两边的质量守恒。代码中定义了分数类并实现了加减乘除和比较操作,同时处理了分子和分母的最大公约数和最小公倍数计算。
摘要由CSDN通过智能技术生成

/*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("+");

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值