高斯消元

原理

见《进阶指南》第159页。

模板题

洛谷-P3389-【模板】高斯消元法open in new window

#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;
}

























 



























最后修改于: