C/C++——计算矩阵的行列式

#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;
}

猜你喜欢

转载自blog.csdn.net/Eyizoha/article/details/89376301