#include <iostream>
#include <cstdlib>
#include <cmath>

using namespace std;

int main(int narg, char* args[])
{
   float a[20][40];
   int   sign= 1;
   float det= 1;
   
   cout << "introduzca el orden de la matriz:\n";
   int n;
   cin >> n;

   cout << "introduzca la matriz:\n";
   for (int i=0; i<n; i++)
     {
      for (int j=0; j<n; j++)
         cin >> a[i][j];
      for (int j=0; j<n; j++)
         a[i][n+j]=  i==j;     // La identidad
     }

   for (int i=0; i<n; i++)     // eliminacion de Gauss
     {
      // poner en a[i][i] el elemento de mayor valor absoluto en la columna i
      int m= i;
      for (int k=i+1; k<i; k++)
         if (abs(a[m][i]) < abs(a[k][i]))
            m= k;

      // intercambiamos la fila m y la fila i
      if (i != m)
        {
         for (int j=0; j<2*n; j++)
             {
              double x= a[i][j];
              a[i][j]= a[m][j];
              a[m][j]= x;
             }
         sign= -sign;
        }

      if (a[i][i]==0)
         {
          cerr << "Error - Matriz singular\n";
          return EXIT_FAILURE; 
         }

      // eliminacion de Gauss

      // triangularizacion bajo la diagonal
      for (int k=i+1; k<n; k++)
         {
          double t= -a[k][i]/a[i][i];
          for (int j=i; j<2*n; j++)
             a[k][j]= a[k][j] + t*a[i][j];
         }

      // diagonalizacion
      for (int k=0; k<i; k++)
         {
          double t= -a[k][i]/a[i][i];
          for (int j=i; j<2*n; j++)
             a[k][j]= a[k][j] + t*a[i][j];
         }

      double x= a[i][i];
      det= det * x;
      for (int j=i; j<2*n; j++)
          a[i][j]= a[i][j] / x;
     }

   det= sign*det;
   cout << "determinante= " << det << endl;
   for (int i=0; i<n; i++)
      {
       for (int j=0; j<n; j++)
           cout << "\t" << a[i][n+j];
       cout << endl;
      }
   

   return EXIT_SUCCESS;
}
