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

#define DIMENSION 8 

void print_matrix(double **A, int d) {
    int i, j;

    for(i=0; i<d ; i++) {
       for(j=0; j<d; j++) {
          printf("% 6.2e  ",A[i][j]);
       }
       printf("\n");
    }
    printf("\n");
}


int main() {
   double **a , **l;
   int   i, j, k, d;

   d = DIMENSION;

   a = (double **)malloc( d * sizeof(double*) );
   l = (double **)malloc( d * sizeof(double*) );   

   for(i=0; i<d; i++) {
      a[i] = (double *)malloc( d * sizeof(double) );
      l[i] = (double *)malloc( d * sizeof(double) );
   }

   srand( (unsigned)time( (long *)0 ));
   for(i=0; i<d ; i++) {
      for(j=0; j<d ; j++) { 
            a[i][j] = rand() /2147483647.0;   /* RAND_MAX = 2^31-1 = 2147483647 */
            l[i][j] = 0.0;
      }
   }
   for(i=0; i<d ; i++) {
      if(a[i][i]==0) { 
         printf("One diagonal element is zero! Exit!\n");
         exit(1);
      }
   }

   print_matrix(a,d);
   printf("\n");
   print_matrix(l,d);

   for(k=0; k < d-1 ; k++) {
      for(i=k+1; i < d ; i++) {    
         l[i][k] = a[i][k]/a[k][k];
         for(j=k; j < d; j++) {
            a[i][j] = a[i][j] - l[i][k]*a[k][j];
         }
      }
   }
   print_matrix(a,d);
   printf("\n");
   print_matrix(l,d);

}

