根据N阶行列式计算公式:
∑ j 1 , j 2... , j n ( − 1 ) τ ( j 1 j 2 . . . j n ) a 1 j 1 a 2 j 2 . . . a n j n \displaystyle\sum_{j1,j2...,jn} (-1)^{\tau(j_1j_2...j_n)}a_{1j_1} a_{2j_2} ...a_{nj_n} j1,j2...,jn∑(−1)τ(j1j2...jn)a1j1a2j2...anjn
将j1,j2,…,jn进行全排列并且计算出他们的反序数,通过循环将各项累加即可
#include <cmath>
#include <algorithm>
#include <vector>
/*计算行列式
data:行列式的所有数据
n:行列式的阶数*/
double CalcDet(double *data, int n)
{
std::vector<int> order;//序列的顺序
double sum = 0;//累加的结果
auto GetNum=[](std::vector<int> &a)
{
int n = a.size() - 1;//最后一个数不用管
int sum = 0;
for (int i = 0; i < n; ++i)
for (int j = i + 1; j <= n; ++j)
++sum;
return sum;
};//获取反序列数目的lambda表达式
//初始化序列
for (int i = 0; i < n; ++i)
order.push_back(i);
do{
double mul = 1.0;
for (int i = 0; i < n; ++i)
mul *= data[i + order[i] * n];
sum += pow(-1, GetNum(order))*mul;
} while (std::next_permutation(order.begin(), order.end()));
return sum;
}
测试代码:
#include <iostream>
using namespace std;
int main()
{
double *data;
int n;
cout << "请输入阶数:";
cin >> n;
data = new double[n*n];
cout << "请输入数据(空格或者换行隔开)" << endl;
for (int i = 0; i < n*n; ++i)
cin >> data[i];
cout << "计算结果为:" << CalcDet(data, n) << endl;
return 0;
}