高斯消元
原理
见《进阶指南》第159
页。
模板题
#include <iostream>
#include <cmath>
using namespace std;
const int N = 110;
const double eps = 1e-6;
int n;
double a[N][N]; // 增广矩阵
int Gauss () {
int r, c;
for (c = 1, r = 1; c <= n; ++ c) {
int idx = r;
for (int i = r; i <= n; ++ i)
if (fabs(a[i][c]) > fabs(a[idx][c]))
idx = i;
if (fabs(a[idx][c]) < eps) continue; // 不 ++ r
swap(a[r], a[idx]);
for (int i = 1; i <= n; ++ i) {
if (i == r) continue;
double rate = a[i][c] / a[r][c];
for (int j = c; j <= n + 1; ++ j)
a[i][j] -= rate * a[r][j];
}
++ r;
}
if (r != n + 1) {
for (int i = r; i <= n; ++ i)
if (fabs(a[i][n + 1]) > eps)
return 2; // 无解
return 1; // 无穷多解
}
for (int i = 1; i <= n; ++ i) a[i][n + 1] /= a[i][i];
return 0; // 唯一解
}
int main () {
scanf("%d", &n);
for (int i = 1; i <= n; ++ i)
for (int j = 1; j <= n + 1; ++ j)
scanf("%lf", &a[i][j]);
int flag = Gauss();
if (flag == 0) {
for (int i = 1; i <= n; ++ i)
printf("%.2lf\n", a[i][n + 1]);
} else {
printf("No Solution");
}
return 0;
}