C语言计算n阶行列式的值
大家都知道计算行列式的一种方法,通过代数余子式展开可以降行列式的阶数,从而简化问题。
任意n阶行列式都可以化为二阶行列式线性之和,利用这个原理,我们采用递归算法,应该效率还算可以吧。
#include<stdio.h>
//从n阶开始在第一行进行展开
int nj(int *p,int n){ //递归一直到二阶行列式
if(n==2){ //首先判定是否为二阶
return *(p+3)*(*p)-*(p+1)*(*(p+2)); //字面意思
}
else{
int i=0,num=0,sum = 0;
int al = (n-1)*(n-1);
int ne[al]; //准备拿来承载新的行列式
for(int q=0;q<n;q++){ //遍历第一行
i=0;num=0; //初始化
for(int k=0;k<n*n;k++){ //该循环得到一个余子式
if(k==n*i+q&&k<n*n) {i++; continue;} //因为是在第一行展开,第一行都要划掉
else if(k<n) {continue;} //这两行是"划掉"此元素所在列
else if(k<n*n){
ne[num] = *(p+k); //得到余子式,即降阶的行列式
num++;
continue;
}
}
if(q%2==0) sum += *(p+q)*nj(ne,n-1); //计算余子式前面的符号
else sum -= *(p+q)*nj(ne,n-1);
}
return sum;
}
}
int main()
{
int n;
scanf("%d",&n);
int all=n*n;
int a[all];
for(int i=0;i<n*n;i++)
scanf("%d",&a[i]); //将矩阵写为一维
printf("%d",nj(a,n));
return 0;
}