Skip to content

高斯消元求行列式 ​

cpp
double det() {
    double ans = 1.0;
    for (int i = 0; i < n; i++) {
        // 列主元选择
        int k = i;
        for (int j = i+1; j < n; j++) 
            if (fabs(a[j][i]) > fabs(a[k][i])) k = j;
        if (k != i) swap(i, k), ans *= -1;  // 行交换符号取反
        if (a[i][i] == 0) return 0;          // 行列式为0
        // 消元操作
        for (int j = i+1; j < n; j++) {
            double factor = a[j][i] / a[i][i];
            for (int k = i; k < n; k++)
                a[j][k] -= factor * a[i][k];
        }
        ans *= a[i][i];  // 累积对角线元素
    }
    return ans;
}