计算行列式最基本的方法就是将行列式化成上三角或者下三角的形式,然后将主对角线上的元素逐个相乘,便能得到整个行列式的值det(A)。根据这一思想,可以用程序语言来模拟这个过程,设该行列式的阶数为n。
由于无论是上三角或者下三角形式的行列式,它的值都只与主对角线上的元素有关。这样我们遍历所有的a[i][i],i=1,2,...,n。如果a[i][i]=0,那么从行数j>i的一行中找出一个不为0的数a[j][i],并把第j行的所有元素与第i行的所有元素互换,符号位sign++;如果找不到,则行列式值为0。接下来用a[i][i]将其之后的元素化为0(
下三角形式),循环n次之后主对角线上的乘积便是整个行列式的值。
#include <cstdio>
#include <cmath>
#define MAXN 100
#define zero(x) (fabs(x)<1e-10)
struct mat{
int n,m;
double data[MAXN][MAXN];
};
double det(const mat &a){
int i,j,k,sign=0;
double b[MAXN][MAXN],ret=1,t;
if(a.n!=a.m) return 0;
for(i=0;i<a.n;i++)
for(j=0;j<a.m;j++)
b[i][j]=a.data[i][j];
for(i=0;i<a.n;i++){//行标+列标
if(zero(b[i][i])){
for(j=i+1;j<a.n;j++)//行标
if(!zero(b[j][i]))
break;
if(j==a.n) return 0;
for(k=i;k<a.n;k++)//列标
t=b[i][k],b[i][k]=b[j][k],b[j][k]=t;
sign++;
}
ret*=b[i][i];
for(k=i+1;k<a.n;k++)//列标
b[i][k]/=b[i][i];
for(j=i+1;j<a.n;j++)//行标
for(k=i+1;k<a.n;k++)//列标
b[j][k]-=b[j][i]*b[i][k];
}
if(sign & 1) ret=-ret;
return ret;
}
int main(){
mat a;
int i,j,n;
while(scanf("%d",&n),n){
a.n=a.m=n;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%lf",&a.data[i][j]);
printf("det a : %.2lf\n",det(a));
}
return 0;
}