高斯消元(模板)

高斯消元 :用来为线性方程组求解,求出矩阵的秩以及逆方阵的逆矩阵

原理:先写出线性方程组的增广矩阵,然后利用初等变换把增广矩阵化为行阶梯矩阵 ,然后从尾到头回带。

#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;
}


你可能感兴趣的:(模板,高斯消元)