利用c语言递归计算n阶行列式 并利用行列式求矩阵的伴随矩阵与逆矩阵

利用c语言递归计算n阶行列式 并利用行列式求矩阵的伴随矩阵与逆矩阵

问题:输入一个数字n,再输入一个n阶行列式,且每一项都是整数,得到行列式的值,同时求出该矩阵的伴随矩阵与逆矩阵(保留四位小数)

首先,计算行列式的值,先想到利用行列式的展开原理使它的阶次慢慢减少,从而很容易想到使用递归,那么如何用递归实现?

小白在学长帮助下所写,欢迎大佬给出指导性意见

话不多说,直接上代码(这里设只算10阶)

#include<stdio.h>
#include<math.h>
int a[10][10];
int caculate(int a[10][10],int n)//构造函数,a[]为数组,n为n阶行列式
{
 	int i,j,k;
 	int sum=0,count1=0,count2=0;
 	if(n==1) return a[0][0];
  	for(i=0;i<n;i++){
   		count1=0,count2=0;//清零 
   		int b[10][10]={};//储存小一阶次的行列式
   		for(j=1;j<n;j++){
    			for(k=0;k<n;k++){
     				if(k==i) continue;
     				else{
      					b[count1][count2++]=a[j][k];//利用行列式展开,将n-1阶行列式储存到数组
     				}           
    			}
    			count1++;//下一行 
    			count2=0;//下一行的第一个元素 
   		}
   		sum+=a[0][i]*(int)pow(-1,i)*caculate(b,n-1);
  	}
 	return sum;
}
int main()
{
 	int i,j,n;
 	scanf("%d",&n);//输入n阶 
 	for(i=0;i<n;i++){
  		for(j=0;j<n;j++){
   			scanf("%d",&a[i][j]);//输入n阶行列式 
  		}
 	}
 	printf("%d",caculate(a,n));
 	return 0; 
}

到这里,咱们已经利用了递归知道了如何得到一个矩阵的行列式的值
接下来,基于此,通过代码实现得到这个矩阵的伴随矩阵与逆矩阵。

根据已有知识,求矩阵的伴随矩阵需要求每一项的代数余子式,即变相求行列式的值,而逆矩阵只需要将伴随矩阵的每一项除以矩阵的行列式的值即可。

由此,咱们开始上代码。

#include<stdio.h>
#include<math.h>
#include<string.h>
int a[10][10];//保存所要求的矩阵
int b[10][10];//保存某项除去改行该列所得的矩阵
int c[10][10];//保存伴随矩阵
int caculate(int a[10][10],int n)
{
 	int i,j,k;
 	int sum=0,count1=0,count2=0if(n==1) return a[0][0];
  	for(i=0;i<n;i++){
   		count1=0,count2=0;
   		int b[10][10]={};
   		for(j=1;j<n;j++){
    			for(k=0;k<n;k++){
     				if(k==i) continue;
     				else{
      					b[count1][count2++]=a[j][k];
     				}           
    			}
    			count1++;
    			count2=0;
   		}	
   		sum+=a[0][i]*(int)pow(-1,i)*caculate(b,n-1);
  	}
 	return sum;
}
//计算矩阵的行列式的值
int main()
{
 	int i,j,n,m,k,count1,count2;
 	int sum;
 	scanf("%d",&n);
 	for(i=0;i<n;i++){
  		for(j=0;j<n;j++){
   			scanf("%d",&a[i][j]);
  		}
 	}
 	sum=caculate(a,n);//先计算所求矩阵的行列式的值,用以求逆矩阵
 	for(i=0;i<n;i++){
  		for(j=0;j<n;j++){
   			count1=0,count2=0;
   			for(m=0;m<n;m++){
    				if(m==i) continue;//跳过所要除去的行
    				for(k=0;k<n;k++){
     					if(k==j) continue;//跳过所要除去的列
     					b[count1][count2++]=a[m][k];//保存某项除去改行该列所得的矩阵
    				}
    				count1++;
    				count2=0;
   			}
	   			c[j][i]=pow(-1,i+j)*caculate(b,n-1);//计算代数余子式并保存
	   		memset(b,0,sizeof(b));//清零数组
  		}
 	}
 	for(i=0;i<n;i++){
  		for(j=0;j<n;j++){
   			printf("%.4f ",(double)c[i][j]);  
  		}
  		printf("\n");
 	}
 	printf("\n");
 	for(i=0;i<n;i++){
  		for(j=0;j<n;j++){
   			printf("%.4f ",(double)c[i][j]/sum); //求逆矩阵
  		}
  		printf("\n");
 	}
 	return 0; 
}

由此 得解。
欢迎各神犇给出指导性意见,蒻耇感激不尽!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值