参考文献:acwing 算法基础课
写这个笔记的时候还没学线性代数,不过高斯消元挺好理解的,没学过线性代数也能懂(除了一些术语不知道以外)
笔记写的字有点丑hh
然后代码实现高斯消元的话就忠实的完成笔记上的步骤就行了
#include <cmath>
#include<iostream>
using namespace std;
const int N=110;
const double eps=1e-8;//因为浮点数的精度问题与0进行直接比较可能会出错,
//所以用了用了一个很小的值来代替0
double a[N][N];
int n;
int gauss()
{
int 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]))//fabs(是对浮点数取绝对值)
t=i;
if(fabs(a[t][c])<eps) continue;//如果当前列的最大行的值都等于0话直接continue
for(int i=c;i<n+1;i++)
swap(a[r][i],a[t][i]);//将最大的一行移到上面
for(int i=n;i>=c;i--)//将该行第c个数变成1
a[r][i]/=a[r][c];//之所以从后往前进行操作是因为
//如果从前往后的话第一个数就变成1了后面再进行操作是无意义的
for(int i=r+1;i<n;i++)//消元
for(int j=n;j>=c;j--)
a[i][j]-=a[i][c]*a[r][j];
r++;
}
if(r<n)//判断是无解还是无穷解
{
for(int i=r;i<n;i++)
if(fabs(a[i][n])>eps)
return 2;
return 1;
}
for(int i=n-1;i>=0;i--)//求解
for(int j=i+1;j<n;j++)
a[i][n]-=a[i][j]*a[j][n];
return 0;
}
int main()
{
cin>>n;
for (int i=0;i<n;i++)
for(int j=0;j<n+1;j++)
cin>>a[i][j];
int t=gauss();
if(t==0)
{
for(int i=0;i<n;i++)
printf("%.2lf\n",a[i][n]);
}
else if(t==1)
cout<<"Infinite group solutions";
else
cout<<"No solution";
return 0;
}