計算行列式最基本的方法就是將行列式化成上三角或者下三角的形式,然后將主對角線上的元素逐個相乘,便能得到整個行列式的值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;
}