利用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=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];
}
}
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;
}
由此 得解。
欢迎各神犇给出指导性意见,蒻耇感激不尽!