Обратная матрица

Программа работает не во всех случаях, например: если убрать условие assert(Det(n, a) != 0), то в случае матрицы 2 * 2, 1 строка: (3 -1), 2 строка: (2 3) программа работает верно, но если оставить условие assert(Det(n, a) != 0), то программа работает неверно. Хотелось бы разобраться в чем заключается ошибка.

#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;
}
int main () {
    int n, i, j, k;
    scanf("%d", &n);
    double a[n][n], e[n][n], x[n][n], t;
        for(i = 0; i < n; i++) {
            for(j = 0; j < n; j++) {
                scanf("%lf", &a[i][j]);
            }
        }
       assert(Det(n, a) != 0);
        for(i = 0; i < n; i++) {
            e[i][i] = 1;
            for(j = 0; j < n; j++) {
                if(j != i)
                    e[i][j] = 0;
            }
        }
        for(k = 0; k < n; k++) {
            for(i = k+1; i < n; i++) {
                t = a[i][k] / a[k][k];
                a[i][k] = 0;
                    for(j = k+1; j < n; j++) {
                        a[i][j] = a[i][j] - t*a[k][j];
                    }
                    for(j = 0; j < n; j++) {
                        e[i][j] = e[i][j] - t*e[k][j];
                    }
            }
        }
        for(j = 0; j < n; j++) {
            for(i = n - 1; i > -1; i--){
                x[i][j] = e[i][j];
                for(k = i+1; k < n; k++) {
                    x[i][j] = x[i][j] - a[i][k] * x[k][j];
                }
                x[i][j] = x[i][j] / a[i][i];
            }
        }
        for(i = 0; i < n; i++) {
            for(j = 0; j < n; j++) {
                printf ("%.3lf ", x[i][j]);
            }
            puts("\n");
        }
}

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