求矩阵行列式的值(方阵)——C

 

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

核心求值代码及解释 :

 

例题:

程序运行结果: 

 

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值