C语言实现行列式计算

C语言实现行列式计算

前言

行列式的计算有多种方法,其中按行(列)展开法最为直观,因此也最容易编写为程序.本文提供两种计算方法.

【方法一】
利用函数的递归,计算任意阶行列式的值。注意:本程序中,在计算行列式之前,需输入行列式的阶数.
C语言在数学计算领域有诸多不便之处,例如数组的长度不可更改,这一点对于行列式的计算来说是极不方便的,因为余子式的阶数比原行列式的阶数要小,而在递归的过程中涉及到数组的长度.为此,设立两个函数,第一个函数DET为计算的主要部分,第二个函数Minor专门用于计算余子式的值,而第二个函数中会调用第一个函数.
【方法二】
利用高斯消元法把行列式化简为上三角形,再累乘对角线元素即可.


代码展示

【方法一】:

#include <stdio.h>
#include <math.h>
#define MAX 20  //最大计算阶数,可以更改

//两个函数的声明
int DET(int arr1[MAX][MAX], int n);
int Minor(int arr1[MAX][MAX], int i, int n);


int DET(int arr1[MAX][MAX], int n)
{
	int i, M, sum = 0;//i是第一行的列指标,M是余子式的值,sum是行列式的计算值
	if (n == 1)//一阶行列式直接得出结果
		return arr1[0][0];
	else if (n > 1)
	{
		for (i = 0; i < n; i++)//按第一行展开
		{
			M = Minor(arr1, i, n);
			sum += pow(-1, i + 2) * arr1[0][i] * M;
		}
	}
	return sum;
}


int Minor(int arr1[MAX][MAX],int i,int n)
{
	int  j, k,result;
	int arr2[MAX][MAX];
	
	//以下为构造余子式的过程。由于C语言的特性,这个过程会比较复杂,需要观察余子式与原行列式的关系。
		for (j = 0; j < n - 1; j++)
		{
			for (k = 0; k < n - 1; k++)
			{
				if (k < i)
					arr2[j][k] = arr1[j + 1][k];
				else if (k >= i)
					arr2[j][k] = arr1[j + 1][k + 1];
			}
		}
		
	return DET(arr2, n - 1);//构造完后,余子式是一个新的行列式,返回DET函数进行计算。
}


int main() 
{
	int arr1[MAX][MAX];
	int a,b,n;
	printf("请输入行列式阶数:");
	scanf_s("%d", &n);
	printf("请输入行列式:\n");
	for (a = 0; a < n; a++) {
		for (b = 0; b < n; b++) {
			scanf_s("%d", &arr1[a][b]);
		}
	}

	printf("%d", DET(arr1, n));
}

【方法二】
注:此方法中数据类型为double型.

#include <stdio.h>
#define MAX 20

void swap(double* a,double*b){
	double tmp = *a;
	*a = *b;
	*b = tmp;
}

void swaparr(double arr[MAX][MAX],int a,int b,int n){
	int i;
	for(i=0;i<n;i++)
		swap(&arr[i][a],&arr[i][b]);	
}

int main(){
	int i,j,k;
	int n;				//阶数 
	int sign=0;			//行列式交换一次需要改变符号,此变量记录交换次数 
	double tmp;			//暂存乘积因子 
	double arr[MAX][MAX];
	double sum=1.0;     //结果 
	
	scanf("%d",&n);
	for(i=0;i<n;i++){
		for(j=0;j<n;j++)
			scanf("%lf",&arr[i][j]);
	}
	
	for(i=0;i<n-1;i++){
		k=1;
		while(arr[i][i]==0.0&&i+k<n){	//确保标准数不为0 
			swaparr(arr,i,i+(k++),n);
			sign++;
		}
		if(arr[i][i]==0.0&&i+k==n){		//整个一行都为0 
			printf("0");
			return 0;
		}
		for(j=i+1;j<n;j++){
			if(arr[j][i]==0.0)			//如为0则那一行不用化简 
				continue;
			else{
				tmp = -(double)arr[j][i]/arr[i][i];		//保存乘积因子 
				for(k=i;k<n;k++)
					arr[j][k] += (tmp*arr[i][k]);
			}
		}
	}
	for(i=0;i<n;i++)
		sum *= arr[i][i];
	if(sign%2==0)				//交换偶数次符号仍为正 
		printf("%f",sum);
	else
		printf("-%f",sum);	
	return 0;
} 
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值