#include <iostream>
double determinant(const double (&M)[2][2]){
return M[0][0] * M[1][1] - M[0][1] * M[1][0];
}
template <std::size_t N>
double determinant(const double (&M)[N][N]){
double det=0.0;
double Mminor[N - 1][N - 1];
double sign = 1.0;
for (int i = 0; i < N; i++) {
//get the minor matrix
for (int a = 1; a < N; a++) {
int m=0;
for (int b = 0; b < N; b++) {
if (b != i) {
Mminor[a - 1][m] = M[a][b];
m++;
}
}
}
//add top row element times determinant of its minor
det += sign * M[0][i] * determinant(Mminor);
//swap the sign
sign *= -1.0;
}
return det;
}
int main(){
const double myMatrix[3][3] = {{1,2,3}, {4,5,6}, {3,6,1}};
double okay = determinant(myMatrix);
std::cout << "determinant = " << okay << std::endl;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKZG91YmxlIGRldGVybWluYW50KGNvbnN0IGRvdWJsZSAoJk0pWzJdWzJdKXsKICAgIHJldHVybiBNWzBdWzBdICogTVsxXVsxXSAtIE1bMF1bMV0gKiBNWzFdWzBdOwp9Cgp0ZW1wbGF0ZSA8c3RkOjpzaXplX3QgTj4KZG91YmxlIGRldGVybWluYW50KGNvbnN0IGRvdWJsZSAoJk0pW05dW05dKXsKICAgIGRvdWJsZSBkZXQ9MC4wOwoKICAgIGRvdWJsZSBNbWlub3JbTiAtIDFdW04gLSAxXTsKICAgIGRvdWJsZSBzaWduID0gMS4wOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOOyBpKyspIHsKICAgICAgICAvL2dldCB0aGUgbWlub3IgbWF0cml4CiAgICAgICAgZm9yIChpbnQgYSA9IDE7IGEgPCBOOyBhKyspIHsKICAgICAgICAgICAgaW50IG09MDsKICAgICAgICAgICAgZm9yIChpbnQgYiA9IDA7IGIgPCBOOyBiKyspIHsKICAgICAgICAgICAgICAgIGlmIChiICE9IGkpIHsKICAgICAgICAgICAgICAgICAgICBNbWlub3JbYSAtIDFdW21dID0gTVthXVtiXTsKICAgICAgICAgICAgICAgICAgICBtKys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy9hZGQgdG9wIHJvdyBlbGVtZW50IHRpbWVzIGRldGVybWluYW50IG9mIGl0cyBtaW5vcgogICAgICAgIGRldCArPSBzaWduICogTVswXVtpXSAqIGRldGVybWluYW50KE1taW5vcik7CiAgICAgICAgLy9zd2FwIHRoZSBzaWduCiAgICAgICAgc2lnbiAqPSAtMS4wOwogICAgfQogICAgcmV0dXJuIGRldDsKfQoKaW50IG1haW4oKXsKICAgIGNvbnN0IGRvdWJsZSBteU1hdHJpeFszXVszXSA9IHt7MSwyLDN9LCB7NCw1LDZ9LCB7Myw2LDF9fTsKICAgIGRvdWJsZSBva2F5ID0gZGV0ZXJtaW5hbnQobXlNYXRyaXgpOwogICAgc3RkOjpjb3V0IDw8ICJkZXRlcm1pbmFudCA9ICIgPDwgb2theSA8PCBzdGQ6OmVuZGw7Cn0=