(1)原理重述如下:

(2)遞歸實現如下:

#include<iostream>
#include<cstdlib>
using namespace std;
double det(int n, double *Mat)
{
if (n == 1)
return Mat[0];
double *subMat = new double[(n - 1)*(n - 1)];//創建n-1階的代數餘子式陣subMat
int mov = 0;//判斷行是否移動
double sum = 0.0;//sum為行列式的值
for (int Matrow = 0; Matrow<n; Matrow++) // Mat的行數把矩陣Mat(nn)賦值到subMat(n-1)
{
for (int subMatrow = 0; subMatrow<n - 1; subMatrow++)//把Mat陣第一列各元素的代數餘子式存到subMat
{
mov = Matrow > subMatrow ? 0 : 1; //subMat中小於Matrow的行,同行賦值,等於的錯過,大於的加一
for (int j = 0; j<n - 1; j++) //從Mat的第二列賦值到第n列
{
subMat[subMatrow*(n - 1) + j] = Mat[(subMatrow + mov)*n + j + 1];
}
}
int flag = (Matrow % 2 == 0 ? 1 : -1);//因為列數為0,所以行數是偶數時候,代數餘子式為1.
sum += flag* Mat[Matrow*n] * det(n - 1, subMat);//Mat第一列各元素與其代數餘子式積的和即為行列式
}
delete[]subMat;
return sum;
}
int main()
{
int n;//階數
cout<<"輸入階數:"<<endl;
cin >> n;//讀入階數
double *Mat = new double[n*n];//動態分配Mat大小
cout << "輸入矩陣:" << endl;
for (int i = 0; i < n*n; i++)
cin >> Mat[i];
cout << "行列式為:" << endl;
cout << det(n, Mat) << endl;
delete[]Mat;//釋放
system("pause");
return 0;
}

推薦閱讀:

相关文章