高斯消元法【模板】

基本上到要用的时候手画一下矩阵就推得出

以第i行的方程式消第i元
如果模板元(a[i][i])为0,方程组存在多解
回元的时候从n到i将每元从s中减去

CODE

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<cmath>
using namespace std;
double a[1010][1010],s[1010];
double ans[1010];
int n;
int main(){
scanf("%d",&n);
for (int i=1;i<=n;++i)
{
for (int j=1;j<=n;++j)
scanf("%lf",&a[i][j]);
scanf("%lf",&s[i]);
}
for (int i=1;i<=n;++i)
{
if (fabs(a[i][i])<0.00000001)
{
printf("No Solution\n");
return 0;
}
for (int j=i+1;j<=n;++j)
{
double ch=a[j][i]/a[i][i];
for (int k=i;k<=n;++k)
a[j][k]-=a[i][k]*ch;
s[j]-=ch*s[i];
}
}
for (int i=n;i>=1;--i)
{
ans[i]=s[i]/a[i][i];
for (int j=1;j<i;++j)
s[j]-=a[j][i]*ans[i];
}
for (int i=1;i<=n;++i)
printf("%.2lf\n",ans[i]);
return 0;
}
--------------------------