#include <stdio.h>
#include <stdlib.h>
#define MAX 100
//宏定义,MAX的值为100,而且必须大写
double D(double arr[][MAX],int n);
//定义一个函数来求子矩阵行列式的值;
//二维数组定义必须要有列的初始化,行可以空着
void Display(double arr[][MAX],int n);
//输出矩阵的函数
int main()
{
double arr[MAX][MAX];
int i,j,n;
printf("请输入行列式的维数:");//默认是n*n的方阵
scanf("%d",&n);
printf("请输入行列式的值:\n");
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("arr[%d][%d]=",i+1,j+1);
scanf("%lf",&arr[i][j]);
}
}
printf("矩阵为\n");
Display(arr,n);//输出矩阵
printf("result=%.2f\n",D(arr,n));
}
double D(double arr[][MAX],int n)
{
double bak[MAX][MAX];//子矩阵
int i,j,k,c;
double sum=0;
if(n==1)
{
return arr[0][0];
//如果行列式只有一个元素,直接返回这个元素值
}
//下面求行列式的值,默认按照第一行展开
for(k=0;k<n;k++)//这里的k相当于第一行中第k+1个元素
{
//下面的处理是指将arr[i][j]中元素存入子矩阵bak[][c]中
for(i=1;i<n;i++)
//逐行处理
//从第二行行开始
{
for(c=0,j=0;j<n;j++)//逐列处理,c为bak的列
{
if(j==k)
{
continue;//当展开的那个元素就在j列中不执行这个for里continue下面语句了。
}
bak[i-1][c++]=arr[i][j];//删去展开元素所在行和列形成子矩阵
}
}
//用递归计算arr*bak的值
sum+=(k%2==0 ? 1 : -1)*arr[0][k]*D(bak,n-1);
//若k能被2整除则取值为1,否则取值为-1
//求行列式值要乘(-1)^(行+列),在这里行+列相当于1+k+1,只需要看k的奇偶即可
}
return sum;
}
void Display(double arr[][MAX],int n)
{
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("%10.1lf",arr[i][j]);
}
printf("\n");
}
}
核心求值代码及解释 :
例题:
程序运行结果: