您的位置:首页 > 其它

高斯消元(模板)

2017-11-12 16:07 351 查看
#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: