Решение СЛУ методом Крамера

Попытался написать программу, которая ищет решения СЛУ с помощью метода Крамера, но программа выводит неверное решение, попытался найти возможные ошибки, но все тщетно. Если есть более оптимальный код, то хотелось бы его увидеть.

#include <stdio.h>
#include <assert.h>
double Det(int n, double(*mat)[n]) {
    int i, j, k;
    double det = 1, a;
        for(k = 0 ; k < n; k++) {
            if (mat[k][k] == 0)
                for(j = k+1; j < n; j++) {
                    if(mat[j][k] != 0) {
                        for(i = k; i < n; i++) {
                            a = mat[k][i];
                            mat[k][i] = mat[j][i];
                            mat[j][i] = a;
                        }
                        det = -det;
                        break;
                    }
                }
            if(mat[k][k] == 0) {
                det = 0;
                break;
            }
            for(i = k + 1; i < n; i++) {
                a = mat[i][k] / mat[k][k];
                for(j = k; j < n; j++)
                    mat[i][j] = mat[i][j] - mat[k][j] * a;
            }
        }
        if(det != 0) {
            if(mat[n-1][n-1] == 0) {
                det = 0;
            }
            else {
                for(i = 0 ; i < n ;i++) {
                    det *= mat[i][i];
                }
            }
        }
        return det;
}
double Sol(int n, double (*mat)[n], double f[n], int k) {
    int i;
    for(i = 0 ; i < n; i++)
        mat[i][k] = f[i];
    double theta = Det(n, mat);
    return theta;
}
int main () {
    int i, j, k, n;
    puts("Add N");
    scanf ("%d", &n);
    double mat[n][n], f[n], a[n][n];
        for(i = 0; i < n; i++)
            for(j = 0; j < n; j++) {
                scanf ("%lf", &mat[i][j]);
                a[i][j] = mat[i][j];
            }
        for(i = 0; i < n; i++)
            scanf ("%lf", &f[i]);
        assert(Det(n, mat) != 0); //Probably change mat
        double det = Det(n, mat);
        printf ("%lf\n", det);
        for(k = 0; k < n; k++) {
            double s = Sol(n, a, f, k)/det;
            printf ("Solution: %lf\n", s);
        }
}

Ответы (0 шт):