计算N阶行列式

根据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 
#include 
#include 
/*计算行列式
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 
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;
}

你可能感兴趣的:(c++,c++,算法)