P3389 【模板】高斯消元法

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int maxn = 105;
 4 typedef double Matrix[maxn][maxn];
 5 void gauss_elimination(Matrix &A, int n) {
 6     // 消元过程
 7     int i, j, k, r;
 8     for (i = 0; i < n; ++i) {
 9         // 选一行r并与第i行交换
10         r = i;
11         for (j = i+1; j < n; ++j)
12             if (fabs(A[j][i]) > fabs(A[r][i])) r = j;
13         if (r != i) for (j = 0; j <= n; ++j) swap(A[r][j], A[i][j]);
14
15         if (!A[i][i]) {
16             puts("No Solution");
17             exit(0);
18         }
19         /*
20         // 与第i+1~n进行消元,低精度
21         for (k = i+1; k < n; ++k) {
22             double f = A[k][i] / A[i][i];
23             for (j = i; j <= n; ++j) A[k][j] -= f * A[i][j];
24         }
25         */
26         for (j = n; j >= i; --j)
27             for (k = i+1; k < n; ++k)
28                 A[k][j] -= A[k][i]/A[i][i] * A[i][j];
29     }
30     // 回代过程
31     for (i = n-1; i >= 0; --i) {
32         for (j = i+1; j < n; ++j)
33             A[i][n] -= A[j][n] * A[i][j];
34         A[i][n] /= A[i][i];
35     }
36 }
37 int main() {
38     Matrix mat;
39     int n; scanf("%d",&n);
40     for (int i = 0; i < n; ++i) {
41         for (int j = 0; j < n+1; ++j) {
42             scanf("%lf",&mat[i][j]);
43         }
44     }
45     gauss_elimination(mat,n);
46     for (int i = 0; i < n; ++i) {
47         printf("%.2f\n",mat[i][n]);
48     }
49     return 0;
50 }
01-04 18:07