/*
* determinant.cpp
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
*/
#include <iostream>
#include <cmath>
using namespace std;
int** submatrix(int **matrix, int order, int i, int j);
int determinant(int **matrix, int order);
int main()
{
int i, j, order;
int **matrix;
cout<<"Enter the order of the matrix: ";
cin>>order;
matrix = new int* [order]; //Allocate memory for pointers (each pointer represents a row)
cout<<"Enter the elements of the matrix: \n";
for(i = 0; i < order; i++) {
matrix[i] = new int[order]; //Each row contains 'order' number of elements
for(j = 0; j< order; j++)
cin>>matrix[i][j];
}
cout<<"\nDeterminant:"<<determinant(matrix, order);
return 0;
}
int** submatrix(int **matrix, int order, int i, int j)
{
int **subm;
int p, q; // Indexes for matrix
int a = 0, b; // Indexes for subm
subm = new int* [order - 1];
for(p = 0; p < order; p++) {
if(p==i) continue; //Skip ith row
subm[a] = new int[order - 1];
b = 0;
for(q = 0; q< order; q++) {
if(q==j) continue; //Skip jth column
subm[a][b++] = matrix[p][q];
}
a++; //Increment row index
}
return subm;
}
int determinant(int **matrix, int order)
{
if(order == 1)
return **matrix; //Return the element if the matrix is of order one
int i;
int det = 0;
for(i = 0; i < order; i++)
det += static_cast<int>(pow(-1.0,(int)i)) * matrix[i][0] * determinant(submatrix(matrix, order, i, 0), order - 1);
return det;
}