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 }