O(n^3)的算法,利用了行列式的性质。
#include<cstdio>
#include<iostream>
#define N 19
using namespace std;
double a[N][N];
int n;
double calcudet()
{
int out;
int i,j;
double k,result=1;
for(out=0;out<n;out++){ //外层阶数循环
for(i=out;i<n;i++){ //寻找第一项不为零的行
if(a[i][out]==0) continue;
for(j=out;j<n;j++){ //第一项不为零的行与顶行交换
k=a[i][j];a[i][j]=a[out][j];a[out][j]=k;
}
if(i==out){
result*=a[out][out];
}
else{
result*=-a[out][out];
} //结果变号
break;
}
if(i==n) return 0;
if(a[out][out]!=1)
for(j=out+1;j<n;j++) //将第一项变为1
a[out][j]/=a[out][out];
a[out][out]=1;
for(i=out+1;i<n;i++) //将该列其余项消为0
for(j=out+1;j<n;j++)
a[i][j]-=a[i][out]*a[out][j];
}
return result;
}
int main()
{
int i,j;
scanf("%d",&n);
for(i=0;i<n;i++){
for(j=0;j<n;j++){
scanf("%lf",&a[i][j]);
}
}
cout<<calcudet();
return 0;
}