/*
#include <math.h>
#include <stdio.h>
#define N 100
#define LIM -100000000
float det(float a[N][N],int n){
if(n==1)
return a[0][0];
if(n==2)
return a[0][0]*a[1][1]-a[0][1]*a[1][0];// the base situation
else{
int j,i,flag=1;
float ret=0;
for(j=0;j<n;j++){//j is the column
int st_c=0,st_r=0;
float a0j=a[0][j];
flag=-flag;
a[0][j]=LIM;
for(i=1;i<n;i++){//compose the trans_a
a[i][j]=LIM;
}//end reseting a
float trans_a[N][N];
for(i=1;i<n;i++){
for(j=0;j<n;j++){
if(a[i][j]!=LIM){
if(st_c==n-1){
st_r++;
st_c=0;
}
trans_a[st_r][st_c]=a[i][j];
st_c++;
}
}//end composing
}
ret+=det(trans_a,n-1)*a0j*flag;
printf("%f\n",ret);
}
return det(a,n-1);
}
}
int main(){
printf("Please enter matrix size n(1<=n<20):");
int n;
scanf("%d",&n);
printf("Please input matrix line by line:\n");
float a[N][N];
int i,j;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%f",&a[i][j]);
printf("matrix a:\n");
for(i=0;i<n;i++){
for(j=0;j<n;j++)
printf("%6.1f",a[i][j]);//the elements
printf("\n");
}
printf("result = %f\n",det(a,n));//the res
return 0;
}*/
#include <math.h>
#include <stdio.h>
#define CONST 1e-6
#define SIZE 20
void InputMatrix (double a[][SIZE], int n);
double DeterminantValue(double a[][SIZE], int n);
void SubMatrix(double a[][SIZE], double b[][SIZE], int n, int row, int col);
void PrintMatrix(double a[][SIZE], int n);
int main(void)
{
double a[SIZE][SIZE];
int n;
double result;
printf("Please enter matrix size n(1<=n<%d):", SIZE);
scanf("%d", &n);
printf("Please input matrix line by line:\n");
InputMatrix(a, n);
printf("matrix a:\n");
PrintMatrix(a, n);
printf("\n");
result = DeterminantValue(a, n);
printf("result = %f\n", result);
return 0;
}
// 函数功能: 输入一个n×n矩阵的元素
void InputMatrix (double a[][SIZE], int n)
{
int i, j;
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
scanf("%lf", &a[i][j]);
}
}
}
// 函数功能: 计算n×n矩阵的行列式的值
double DeterminantValue(double a[][SIZE], int n)
{
int i = 0, j = 0;
double temp, result, b[SIZE][SIZE];
if (n == 1)
{
result = a[0][0];
}
else if (n == 2)
{
result = a[0][0] * a[1][1] - a[0][1] * a[1][0];
}
else
{
result = 0.0;
for (j = 0; j < n; j++)//遍历列
{
SubMatrix(a, b, n, i, j);//the key
printf("Submatrix:\n");
PrintMatrix(b, n - 1);
temp = DeterminantValue(b, n - 1); //递归
result += pow(-1, i + j) * a[0][j] * temp;
printf("DValue of the Submatrix is %6.1f\n", temp);
}
}
return result;
}
// 函数功能: 计算n×n矩阵a中第row行col列元素的(n-1)×(n-1)子矩阵b
void SubMatrix(double a[][SIZE], double b[][SIZE], int n, int row,
int col)
{
int i, j, ii = 0, jj = 0;
for (i = 0; i < n; i++)
{
jj = 0;//回归0
for (j = 0; j < n; j++)//复制第j列的数
{
if (i != row && j != col)//过滤行列为i j的项
{
b[ii][jj] = a[i][j];
jj++;
}
}
if (i != row && j != col)//复制完后向下推进一行
{
ii++;////////////////////////////////////////////////////////
} ///////两次的i!=row&&...直接不考虑row,col上的数/////////
} ////////////////////////////////////////////////////////
}
// 函数功能: 输出一个n×n矩阵的元素
void PrintMatrix(double a[][SIZE], int n)
{
int i, j;
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
printf("%6.1f\t", a[i][j]);
}
printf("\n");
}
}