#include<iostream>
#include<string.h>
#include<algorithm>
#include<stdio.h>
using namespace std;
int x[1000];
int zdgys(int a,int b)//求最大公约数
{
int c=1;
if(a*b<0)
c=-1;
if(a<0)
a=-a;
if(b<0)
b=-b;
if(a==0)
return b;
if(b==0)
return a;
while(a&&b)
{
if(a>=b)
a=a%b;
else
b=b%a;
if(a==0)
c=c*b;
if(b==0)
c=c*a;
}
return c;
}
int gauss(int a[][100],int r,int c)
{
int i,j,k,ta,tb,t,sum;
for(i=0;i<r&&i<c;i++)
{
if(a[i][i]==0)
{
for(k=i+1;k<r;k++)
{
if(a[k][i]!=0)
{
for(j=i;j<c+1;j++)
{
a[i][j]=a[k][j]+a[i][j];
}
break;
}
}
}
for(k=0;k<r;k++)
{
if(k==i||a[i][i]==0)
continue;
// cout<<a[k][i]<<" "<<a[i][i]<<endl;
t=zdgys(a[k][i],a[i][i]);
ta=a[k][i]/t;
tb=a[i][i]/t;
//cout<<ta<<"tttt ttt"<<tb<<endl;
for(j=0;j<c+1;j++)
{
a[k][j]=a[k][j]*tb-a[i][j]*ta;
}
}
//ssssssssssssssss
/* for(k=0;k<r;k++)
{
for(j=0;j<c+1;j++)
{
cout<<a[k][j]<<" ";
}
cout<<endl;
}
*/
//sssssssssssssssssssss
}
for(i=0;i<r;i++)
{
sum=0;
if(a[i][i]==0&&a[i][c]!=0)
{
cout<<"无解"<<endl;
return 0;
}
if(a[i][i]!=0)
{
sum++;
x[i]=a[i][c]/a[i][i];
}
else
x[i]=0;
}
if(sum<c)
{
cout<<"无穷多解"<<endl;
return 0;
}
return 1;
}
int main()
{
int a[100][100],n,m,i,j;
while(cin>>n>>m)
{
memset(x,0,sizeof(x));
for(i=0;i<n;i++)
{
for(j=0;j<=m;j++)
{
cin>>a[i][j];
}
}
int ans=gauss(a,n,m);//cout<<"ssssss"<<endl;
if(ans)
{
for(i=0;i<n;i++)
{
cout<<x[i];
if(i!=n-1)
cout<<" ";
else
cout<<endl;
}
}
}
return 0;
}
高斯消元(模板)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.