博主刚刚开始学习线性代数,无奈高阶行列式太难算了,便打算用电脑来计算这种重复工作。
方法如图
(博主debug一年后)下面给出了代码
#include<iostream>
using namespace std;
double deter[10][10]; //存储行列式的值
int n, p[11], hashtable[11] = { 0 }; //全排列用到的数组和哈希数组
double caching = 1; //储存每一个多项式的值
double answer = 0; //最终答案
void generatep(int index=1); //递归全排列&行列式计算过程
int reverse_ordinal(int* p, int n); //求一个数列的逆序数
int main()
{
cout << "请输入行列式的阶级数\n";
cin >> n; //输入阶级
cout << "输入行列式\n";
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++)
cin>>deter[i][j]; //输入行列式
generatep();
cout << answer;
return 0;
}
void generatep(int index) //递归全排列&行列式计算过程
{ //递归看不懂的建议先看看递归法求全排列
if (index == n + 1)
{
for (int i = 1,j = 0; i <= n; i++,j++)
{
caching *= deter[j][p[i]-1]; //p储存了每一行要选择的元素的位置,在这里把a_i1到a_in乘在一起
}
answer += reverse_ordinal(p,n)*caching; //把乘好的多项式相加,reverse_ordinal(p,n)通过逆序数判断正负
caching = 1;
return;
}
for (int x = 1; x <= n; x++)
{
if (hashtable[x] == 0)
{
p[index] = x;
hashtable[x] = 1;
generatep(index + 1);
hashtable[x] = 0;
}
}
}
int reverse_ordinal(int* p, int n) //这里博主因为实力有限就用暴力法求逆序列了,热心的小伙伴自己可以去优化下
{
int i, j;
int amount = 0;
for (i = 1; i <= n; i++)
for (j = i; j <= n; j++)
{
if (p[i] > p[j])
amount++;
}
if (amount % 2 == 0)
return 1;
else
return -1;
}
看完后小伙伴们肯定收获了不少,点个赞再走吧!