gauss

高斯消元法,用于解线性方程组,方法与小学解二元一次方程类似。

以下将以程序形式实现该算法

输入格式

第一行,一个正整数 n

第二至 n+1行,每行 n+1个整数,为a1,a2……an和b,代表一组方程

输出格式

共n行,每行一个数,第i行为xi (保留2位小数)

如果不存在唯一解,在第一行输出”No Solution”

样例

1
2
3
4
5
6
7
8
3
1 3 4 5
1 4 7 3
9 3 2 2

-0.97
5.18
-2.39

代码

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
46
47
48
49
#include <cstdio>
#include <cmath>
#include <algorithm>
#define eps (1e-6)
using namespace std;
int n;
double a[110][110];
bool p;
void gauss(){
for(int i=1;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(r!=i)for(int j=1;j<=n+1;++j)
swap(a[i][j],a[r][j]);

if(fabs(a[i][i])<eps){
p=false;
return;
}
for(int j=1;j<=n;++j){
if(j!=i){
double tmp=a[j][i]/a[i][i];
for(int k=i+1;k<=n+1;++k)
a[j][k]-=a[i][k]*tmp;
}
}
}
for(int i=1;i<=n;++i)
a[i][n+1]/=a[i][i];
}
int main(){
p=true;
scanf("%d",&n);
for(int i=1;i<=n;++i)
for(int j=1;j<=n+1;++j)
scanf("%lf",&a[i][j]);
gauss();
if(!p){
printf("No Solution");
return 0;
}
else{
for(int i=1;i<=n;++i)
printf("%.2lf\n",a[i][n+1]);
}
return 0;
}