#include <iostream>
using namespace std;
int main ()
/*Este programa pide al usuario una matriz de orden n la diagonaliza por el
metodo de Gauss-Jordan sin pivote y calcula su inversa*/
{
//Genero las variables, la matriz, la pido al usuario y la muestro por pantalla
int n;double long t;int w;
cout<<"Introduzca el orden de la matriz:"<<endl;
cin>>n;int q=n;
double A[n][(2*n)];double B[n][n];
for(int i=0;i<n;i++){
for(int k=0;k<n;k++){
cout<<"Introduzca el elemento de la fila "<<i+1<<" y la columna "<<k+1<<endl;
cin>>A[i][k];
}
}
cout<<endl<<endl;
for(int i=0;i<n;i++){
for(int k=0;k<n;k++){
cout<<A[i][k]<<" ";
if(k==n-1){cout<<endl;}
}
}
//Genero la matriz identidad
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(j==i){B[i][j]=1.0;}
else{B[i][j]=0.0;}
}
}
//Acoplo la matriz identidad para trabajar con ella
for(int j=0;j<n;j++){
int a=0;
for(int i=n;i<2*n;i++){
A[j][i]=B[j][a];
a++;
}
}
//Muestro la matriz con la que voy a trabajar
cout<<endl<<endl<<"La matriz introducida con la identidad acoplada es:"<<endl<<endl;
for(int i=0;i<n;i++){
for(int k=0;k<2*n;k++){
cout<<A[i][k]<<" ";
}
cout<<endl;
}
cout<<endl<<endl;
//Triangulo la matriz
int u=2;
for(int i=0;i<n;i++){
for(int k=i+1;k<n;k++){
//Activo este bucle para evitar que el programa divida por 0 (el pivote sea 0)
if(A[i][i]==0){
double sum =0.0;
for(int x=i+1;x<n;x++){
if(A[x][i]!=0){sum=1;break;}
sum=sum+A[x][i];
}
if(sum==0){u=1;break;}
}
if(u==1){break;}
int a=i+1;
//Permutamos las filas mientras el pivote sea 0
while(A[i][i]==0){
for(int s=0;s<2*n;s++){
int p = A[i][s];A[i][s]=A[a][s];A[a][s]=p;
}
a++;
}
t=A[k][i]/A[i][i];
for(int j=0;j<2*n;j++){
if(u==1){break;}
A[k][j]=A[k][j]-t*A[i][j];
}
}
}
cout<<endl<<endl;
//Muestro la matriz triangulada
cout<<"La matriz triangulada es:"<<endl<<endl;
for(int i=0;i<n;i++){
for(int k=0;k<2*n;k++){
cout<<A[i][k]<<" ";
}
cout<<endl;
}
cout<<endl<<endl;
//Aplico Gauss-Jordan
for(int i=0;i<n;i++){
q--;w=q;
for(int k=i+1;k<n;k++){
w--;
t=A[w][q]/A[q][q];
for(int j=0;j<2*n;j++){
A[w][j]=A[w][j]-t*A[q][j];
}
}
}
for(int i=0;i<n;i++){
for(int j=n;j<2*n;j++){
A[i][j]=A[i][j]/A[i][i];
}
A[i][i]=1;
}
//Muestro la matriz diagonalizada y la inversa:
cout<<"La matriz diagonalizada y la inversa de A es:"<<endl<<endl;
for(int i=0;i<n;i++){
for(int k=0;k<2*n;k++){
cout<<A[i][k]<<" ";
}
cout<<endl;
}
system("pause");return 0;
}