#include <stdlib.h>
#include <stdio.h>
#include <math.h>

void print(double ** m, int N)
{
    for(int i = 0; i < N; ++i)
    {
        for(int j = 0; j < N; ++j)
        {
            printf("%.1lf ",m[i][j]);
        }
        puts("");
    }
    puts("");
}


double GaussDet(double**m, int n)
{
    double det = 1;
    for(int i = 0; i < n; ++i)
    {
        double mx = fabs(m[i][i]);
        int idx = i;
        for(int j = i+1; j < n; ++j)
            if (mx < fabs(m[i][j])) mx = fabs(m[i][idx = j]);
        if (idx != i)
        {
            for(int j = i; j < n; ++j)
            {
                double t = m[j][i];
                m[j][i] = m[j][idx];
                m[j][idx] = t;
            }
            det = -det;
        }
        for(int k = i+1; k < n; ++k)
        {
            double t = m[k][i]/m[i][i];

            for(int j = i; j < n; ++j)
                m[k][j] -= m[i][j]*t;
        }
    }
    for(int i = 0; i < n; ++i) det *= m[i][i];
    return det;
}


int main(int argc, const char * argv[])
{
    #define  N  5
    double ** m = malloc(N*sizeof(double*));
    for(int i = 0; i < N; ++i) m[i] = malloc(N*sizeof(double));

    for(int i = 0; i < N; ++i)
    {
        for(int j = 0; j < N; ++j)
        {
            m[i][j] = rand()%10;
        }
    }
    m[0][0] = 0;
    print(m,N);

    printf("Det = %lf\n",GaussDet(m,N));

}
