题目
https://www.luogu.org/problemnew/show/P3389
思路
模版题。
高斯消元是什么?
其实就是加减消元。
每次取一个元,消去,可以得到i-1个新方程式,不停往下推,即可求出答案。
注意,题目要求不存在唯一解,在第一行输出”No Solution”,所以无论是无解还是有自由元,都输出”No Solution”,即要消去的元绝对值最大值为0,就算无解。
代码
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
const double zero=1e-7;
int n;
double a[111][111];
bool gauss()
{
for(int i=0;i<n;i++)
{
int r=i;
for(int j=i+1;j<n;j++) if(fabs(a[j][i])>fabs(a[r][i])) r=j;
if(fabs(a[r][i])<zero) return 0;
if(r!=i) for(int j=0;j<=n;j++) swap(a[r][j],a[i][j]);
for(int j=i+1;j<n;j++)
{
double f=a[j][i]/a[i][i];
for(int k=i;k<=n;k++) a[j][k]-=f*a[i][k];
}
}
for(int i=n-1;i>=0;i--)
{
for(int j=i+1;j<n;j++) a[i][n]-=a[j][n]*a[i][j];
a[i][n]/=a[i][i];
}
return 1;
}
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
for(int j=0;j<=n;j++)
{
scanf("%lf",&a[i][j]);
}
if(!gauss())
{
printf("No Solution"); return 0;
}
for(int i=0;i<n;i++) printf("%.2lf\n",a[i][n]);
}