原理:先写出线性方程组的增广矩阵,然后利用初等变换把增广矩阵化为行阶梯矩阵 ,然后从尾到头回带。
#include<bits/stdc++.h> using namespace std; const int N=105; int x[N]; int free_x[N]; int free_num; int a[N][N]; int equ,var; int gcd (int a,int b) { return b? gcd(b,a%b) : a ; } int lcm(int a,int b) { return a/gcd(a,b)*b; } void Import() { memset(a,0,sizeof(a)); memset(x,0,sizeof(x)); memset(free_x,0,sizeof(free_x)); for(int i=0;i<equ;i++) for(int j=0;j<var+1;j++) cin>>a[i][j]; } void Export() { if(free_num==-1) puts("No Solution!"); else if(free_num=-2) puts("With double but don'thas Integer solution!"); else if(free_num>0) { printf("With many solution ,and the va number is:%d\n",free_num); for(int i=0;i<var;i++) { if(free_x[i])printf("x%d is not certain!\n",i+1); else printf("x%d:%d\n",i+1,x[i]); } } else { for(int i=0;i<var;i++) printf("x%d:%d\n",i+1,x[i]); } } int Guass() { int i,j,k; int max_r; int ta,tb; int free_x_num; int free_index; int LCM,tmp; int col=0; for(k=0;k<equ&&col<var;k++,col++) { max_r=k; for(i=k+1;i<equ;i++) { if(abs(a[i][col])>abs(a[max_r][col])) max_r=i; } if(max_r!=k) { for(j=k;j<var+1;j++) swap(a[k][j],a[max_r][j]); } if(a[k][col]==0) { k--; continue; } for(i=k+1;i<equ;i++) { if(a[i][col]!=0) { LCM=lcm(abs(a[i][col]),abs(a[k][col])); ta=LCM/abs(a[i][col]); tb=LCM/abs(a[k][col]); if(a[i][col]*a[k][col]<0) tb=-tb; for(j=col;j<var+1;j++) { a[i][j]=a[i][j]*ta-a[k][j]*tb; } } } }//以上是化增广矩阵为行阶梯形矩阵
//下面是非递归回带的过程
for(i=k;i<equ;i++) if(a[i][col]!=0) return -1; if(k<equ) { for(i=k-1;i>=0;--i) { free_num=0; for(j=0;j<var;j++) { if(a[i][j]!=0&&free_x[j]) { free_x_num++; free_index=j; } } if(free_x_num>1)continue; tmp=a[i][var]; for(j=0;j<var;j++) if(a[i][j]!=0&&j!= free_index ) tmp -= a[i][j]*x[j]; x[free_index]=tmp; free_x[free_index]=0; } return var-k; } for(i=var-1;i>=0;--i) { tmp=a[i][var]; for(j=i+1;j<var;j++) { if(a[i][j]!=0) tmp-=a[i][j]*x[j]; } if(tmp%a[i][i]!=0) return -2; x[i]=tmp/a[i][i]; } return 0; } void print() { for(int i=0;i<equ;i++) { for(int j=0;j<var+1;j++) printf("%d",a[i][j]); puts(""); } } int main() { while(cin>>equ>>var) { Import(); free_num=Guass(); Export(); } return 0; }