高斯消元模板

LuoguP3389

就是一道自己康康+手模的数学题啊qwq

Code:

高斯消元模板
 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const double eps = 1E-8;//因为精度问题所以要取一个十分小的数来作为判断是否为0的标准 
 4 int n;
 5 double a[101][101];//用来存矩阵 
 6 int main () {
 7     scanf("%d", &n);
 8     for (int i = 0; i < n; i++) {
 9         for (int j = 0; j <= n; j++) {
10             scanf("%lf", &a[i][j]);
11         }
12     }
13     for (int i = 0; i < n; i++) {
14         int pre = i;
15         for (int j = i; j < n; j++) {//每次遍历选择一个当前位置系数绝对值最大的调换过来,防止误差 
16             if (fabs(a[j][i] - a[pre][i]) >= eps) {
17                 pre = j;
18             }
19         }
20         for (int k = 0; k <= n; k++) {//将这两行交换,把待处理的一行调至上方 
21             swap(a[i][k], a[pre][k]);
22         }
23         if (fabs(a[i][i]) <= eps) {//如果系数为0就一定无解 
24             printf("No Solution\n");
25             return 0;
26         }
27         for (int k = i + 1; k <= n; k++) {//将该位系数化一并将这一行系数同除a[i][i] 
28             a[i][k] /= a[i][i];
29         }
30         a[i][i] = 1;//a[i][i]这个位置除或不除都可以,因为它这个位置化 1 后就不会对后面的值造成影响了,可以将其忽略 
31         for (int j = 0; j < n; j++) {//枚举每一行 
32             if (i != j) {//不能再处理当前这一行 
33                 for (int k = i + 1; k <= n; k++) {//这里直接从i+1位置开始即可 
34                     a[j][k] -= a[j][i] * a[i][k];//就是j行最前面那个不为0的系数乘上i行相应列的位置,然后此位置减去即可 
35                 }
36                 //a[j][i] = 0; 加或不加都可以 
37             }
38         }
39     }
40     for (int i = 0; i < n; i++) {
41         printf("%.2lf\n", a[i][n]);//输出答案 
42     }
43     return 0;
44 }
View Code

 

上一篇:pdf转eps文件


下一篇:PE、PB、PS、ROE、EPS含义及计算公式