高斯消元 :用来为线性方程组求解,求出矩阵的秩以及逆方阵的逆矩阵
原理:先写出线性方程组的增广矩阵,然后利用初等变换把增广矩阵化为行阶梯矩阵 ,然后从尾到头回带。
#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;
}