高斯消元法 -math
作者:互联网
#include <bits/stdc++.h> #define dbg(x) std::cerr << #x << "=" << x << "\n" using i64 = long long; const int N = 105; std::vector<double> f[N]; void output(int n) { for (int i = 1; i <= n; i++) { for (int j = 1; j <= n + 1; j++) { std::cerr << f[i][j] << " \n"[j == n + 1]; } } std::cerr << "\n"; } signed main() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); std::cout << std::fixed << std::setprecision(2); std::cerr << std::fixed << std::setprecision(2); int n; std::cin >> n; for (int i = 1; i <= n; i++) { f[i].resize(n + 2); for (int j = 1; j <= n + 1; j++) { std::cin >> f[i][j]; } } //运用矩阵的左上到右下的对角线性质算答案 for (int i = 1; i <= n; i++) {//第i行第i列的数拿去减掉其他行的数 if (f[i][i] == 0) { int flag = 1; for (int j = i; j <= n; j++) { if (f[j][i] == 0) continue; std::swap(f[i], f[j]); //output(n); flag = 0; break; } if (flag) { std::cout << "No Solution\n"; return 0; } } for (int j = 1; j <= n; j++) { if (j == i) continue;//不是自己这行 if (f[j][i] == 0) continue;//如果自己是0就不用减了,加快速度 double coef = f[j][i] / f[i][i]; for (int k = 1; k <= n + 1; k++) { f[j][k] -= f[i][k] * coef; } //output(n); } } for (int i = 1; i <= n; i++) { if (f[i][i] == 0) { std::cout << "No Solution\n"; return 0; } } for (int i = 1; i <= n; i++) { if (f[i][n + 1] == 0) std::cout << 0.00 << "\n"; else std::cout << 1.0 * f[i][n + 1] / f[i][i] << "\n"; } return 0; }
标签:std,int,void,dbg,高斯消,math,元法 来源: https://www.cnblogs.com/zrzsblog/p/16511715.html