#include<stdio.h>#include<stdlib.h>double det(double **D,int n) //输入代表矩阵的二维数组、矩阵阶数,返回矩阵的行列式{double d=0;// 一阶二阶直接计算if(n==1)d=D[0][0];if(n==2)d=D[0][0]*D[1][1]-D[0][1]*D[1][0];else{for(int k=0;k<n;k++){// 为代数余子式申请内存double **M;M=(double**)malloc((n-1)*sizeof(double*));for(int i=0;i<n-1;i++)M[i]=(double*)malloc((n-1)*sizeof(double));// 为代数余子式赋值for(int i=0;i<n-1;i++)for(int j=0;j<n-1;j++)M[i][j]=D[i+1][j<k?j:j+1];// 按第一行展开,递归计算行列式,注意元素0则不展开可以加快计算速度if(D[0][k])d+=D[0][k]*det(M,n-1)*(((2+k)%2)?-1:1);// 释放内存for(int i=0;i<n-1;i++)free(M[i]);free(M);}}return d; }int main(){// 输入矩阵阶数int n;printf("n:");scanf("%d",&n); // 为矩阵申请内存double **D;D=(double**)malloc(n*sizeof(double*));for(int i=0;i<n;i++)D[i]=(double*)malloc(n*sizeof(double));// 矩阵输入for(int i=0;i<n;i++)for(int j=0;j<n;j++)//scanf("%lf",&D[i][j]);D[i][j]=rand()%10;printf("D:\n");// 打印矩阵for(int i=0;i<n;i++){{for(int j=0;j<n;j++)printf("%g\t",D[i][j]);}printf("\n");}// 输出行列式printf("det(D)=%g\n",det(D,n));//system("pause");// 释放内存for(int i=0;i<n;i++)free(D[i]);free(D);return 0;}