AcWing 883. 高斯消元解线性方程组
原题链接
简单
作者:
术
,
2021-03-14 15:36:34
,
所有人可见
,
阅读 256
#include <iostream>
#include <math.h>
using namespace std;
const int N=105;
const double eps=1e-6;
double a[N][N];
double ans[N];
int n;
int gauss()
{
int c,r;//按c遍历,r为已经确认的行数
for(c=0,r=0; c<n; c++)
{
int t=r;//保存该列最大值
for(int i=r; i<n; i++)
{
if(fabs(a[i][c])>fabs(a[t][c]))
t=i;
}
if(fabs(a[t][c])<eps)
continue;
//交换
for(int i=0; i<=n; i++)
{
swap(a[t][i],a[r][i]);
}
//将a[r][c]变为1
for(int i=n; i>=c; i--)
a[r][i]/=a[r][c];
//将所有未确定的 第c列变为0
for(int i=r+1; i<n; i++)
if(fabs(a[i][c])>eps)
{
double k=a[i][c]/a[r][c];
for(int j=n; j>=c; j--)
{
a[i][j]=a[i][j]-k*a[r][j];
}
}
r++;
}
if(r<n)//秩为r
{
for(int i=r;i<n;i++)
if(fabs(a[i][n])>eps)
return 2;
return 3;
}
//求解
for(int i=n-1;i>=0;i--){
ans[i]=a[i][n];
for(int j=i+1;j<n;j++){
ans[i]=ans[i]-a[i][j]*ans[j];
}
}
return 1;
}
int main()
{
cin>>n;
for(int i=0; i<n; i++)
for(int j=0; j<=n; j++)
cin>>a[i][j];
int flag=gauss();
if(flag==1)
for(int i=0; i<n; i++)
printf("%.2lf\n",ans[i]);
else if(flag==2)
cout<<"No solution"<<endl;
else
cout<<"Infinite group solutions"<<endl;
return 0;
}