一、前言

最近在捣鼓C++,学到线代的行列式之后就想着来捣鼓一下求行列式的值。主要原因是当时群里有人在捣鼓着用上下三角来求值,所以我最后就去玩定义法求值了。

二、n阶行列式的定义

从定义中我们可以看出值计算公式由三个部分组成:分别是逆序数r,行列式中n项的相乘并相加,以及全排列 j1 、j2 、j3......jn。

三、代码实现

1.首先我们先构架好基本框架:

#include <iostream>
#include <cmath>
using namespace std;const int u = 10;            //最大阶数限制int main()
{int finalanswer;int arr[u][u];cout << "请输入行列式的阶数" << endl;cin >> n;for (int i = 0; i < n; i++)                           //给行列式的每项进行赋值 {cout << endl;for (int h = 0; h < n; h++){cout << "a" << i + 1 << h + 1 << " 的值:";cin >> arr[i][h];}}}

cmath的头文件是因为接下来的逆序数需要用到pow(或者你也可以用for循环?)

2.排列数

int a[u];        //需要进行排列的数的数组for (i = 0; i < n; i++)         //给排列赋值
{a[i] = i + 1;
}

定义中的j1,j2,jn就是排列数,通过排列数来最后得出所需要相加的所有的项的值。

3.逆序数

int Reverse(int n, int a[])                 //逆序数
{int t = 0;for (int i = 1; i < n; i++){for (int h = 0; h < i; h++){if (a[i]<a[h]){t = t + 1;}}}return t;
}

逆序数的算法比较简单,只需要用两层for检测某一位的数的前几位有多少数比他大即可。

4.求全排列

void Perm(int start, int end, int a[])        start=0  end为行列式阶数
{if (start == end){for (int j = 0; j < end; j++){cout << a[j] << " ";}cout << endl;}for (int i = start; i < end; i++){swap(a[start], a[i]);Perm(start + 1, end, a);swap(a[i], a[start]);}
}

这是用递归法求全排列的一种方法,参考了这位大哥的方法:          https://blog.csdn.net/hf19931101/article/details/79452799

其中start = 0,end就是行列式的阶数,也就是n。具体的解析可以看上面链接的。

5.计算行列式每个项的值

行列式最终的值是由几个项相加而成的,而那几个项则是由n个行列式中的元素相乘而得来的,而项中每项元素的列(行)下标则是1 2 3 ... n的某一种排列,而所有的项的列(行)下标就构成了1 2 3 ... n 的所有排列情况。

int Answer(int arr[u][u], int a[], int n, int t)              //计算行列式的每项的值
{int answer = 0;int temp_answer = 1;int t_2 = 0;for (int i = 0; i < n; i++){temp_answer = temp_answer * arr[i][a[i]-1];}t_2 = pow(-1, t);answer = temp_answer * t_2;return answer;
}

t 就是该项的各个元素的列(行)下标所对应的逆序数。temp_answer是该项中元素的累乘。t_2则是 - 1 的t次方。

6.所有项相加得出最终结果

我们定义一个Final_Answer来作为最终结果,并且将Answer函数和Perm函数以及Reverse相融合。

void Perm(int start, int end, int a[], int arr[10][10], int &Final_Answer)
{if (start == end){Final_Answer = Final_Answer + Answer(arr, a, end, Reverse(end, a));return;}for (int i = start; i < end; i++){swap(a[start], a[i]);      Perm(start + 1, end, a, arr, Final_Answer);  swap(a[i], a[start]);      }}

Final_Answer的值是一个值传递,因此我们用&来进行引用(或者利用指针)。Reverse函数所在的位置就是Answer函数的 t ,也就是逆序数。最后再在main函数之中调用并cout一下即可。

    Perm(0, n, a, arr, Final_Answer);cout << "行列式的值为: " << Final_Answer << endl;

7.全部代码

#include <iostream>
#include <cmath>
using namespace std;int Reverse(int n, int a[])
{int t = 0;for (int i = 1; i < n; i++){for (int h = 0; h < i; h++){if (a[i]<a[h]){t = t + 1;}}}return t;
}int Answer(int arr[10][10], int a[], int n, int t)
{int answer = 0;int temp_answer = 1;int t_2 = 0;for (int i = 0; i < n; i++){temp_answer = temp_answer * arr[i][a[i]-1];}t_2 = pow(-1, t);answer = temp_answer * t_2;return answer;
}void Perm(int start, int end, int a[], int arr[10][10], int &Final_Answer)
{if (start == end){Final_Answer = Final_Answer + Answer(arr, a, end, Reverse(end, a));return;}for (int i = start; i < end; i++){swap(a[start], a[i]);      Perm(start + 1, end, a, arr, Final_Answer);   swap(a[i], a[start]);      }}int main()
{int Final_Answer = 0;int i, n, a[10];int arr[10][10];cout << "请输入行列式的阶数" << endl;cin >> n;for (i = 0; i < n; i++)         //给排列赋值{a[i] = i + 1;}for (int i = 0; i < n; i++){cout << endl;for (int h = 0; h < n; h++){cout << "a" << i + 1 << h + 1 << " 的值:";cin >> arr[i][h];}}Perm(0, n, a, arr, Final_Answer);cout << "行列式的值为: " << Final_Answer << endl;return 0;
}

C++ 代码实现定义法计算行列式的值相关推荐

  1. java之利用行列式展开法,计算行列式的值

    一.提出问题 如何利用行列式展开法计算行列式的值 二.基本理论与操作说明 三.举例说明 1.代码 public class first {static int[][] geta(int m[][],i ...

  2. 用均值方差法计算边际VaR值和成分VaR值(Python)

    tushare ID:432833 边际VaR值和成分VaR值定义 VaR:Value at Risks,在险价值,是指未来一段特定的时间内,在市场正常波动的情况下,某一金融资产或投资组合在给定置信水 ...

  3. crc16码表的使用_查表法计算CRC16校验值

    CRC16是单片机程序中常用的一种校验算法.依据所采用多项式的不同,得到的结果也不相同.常用的多项式有CRC-16/IBM和CRC-16/CCITT等.本文代码采用的多项式为CRC-16/IBM: X ...

  4. crc16modbus查表法_查表法计算CRC16校验值

    /******************************************************************************* * Copyright (c) 201 ...

  5. python3计算行列式的值(运用拉普拉斯展开法递归实现)

    """ 递归(拉普拉斯展开)计算n阶行列式 传入的一定为"正方形" input: [ [1,2,3,4], [5,6,7,8], [9,1,2,3], ...

  6. c语言编写程序计算行列式值,求行列式的值,用C语言怎么写啊? 如何求行列式的值...

    导航:网站首页 > 求行列式的值,用C语言怎么写啊? 如何求行列式的值 求行列式的值,用C语言怎么写啊? 如何求行列式的值 相关问题: 匿名网友: 行列式计算公式知道吧,给你个源码参考,大一时写 ...

  7. C语言用代数余子式计算行列式

    本章主要介绍利用代数余子式计算行列的原理及代码实现 除了代数余子式法,其他计算行列式的方法如下: 1)利用高斯法计算行列式 2)利用LU分解法计算行列式 目录 1.代数余子式计算行列式的原理 二阶行列 ...

  8. 行列式求值、矩阵求逆

    #include <iostream> #include <string> #include <assert.h> #include <malloc.h> ...

  9. 6*6行列式相加的c语言,求行列式的值,用C语言怎么写啊?

    优质回答 回答者:徐州小可爱 行列式计算公式知道吧,给你个源码参考,大一时写的. #include #include #define MAX 9 /*定义最大为9阶行列式*/ int Fun(int ...

  10. 信息安全风险评估---矩阵法计算风险

    矩阵法计算风险 假设:有以下信息系统中资产面临威胁利用脆弱性的情况: 共有两项重要财产:资产A1和资产A2: 资产A1面临一个主要威胁T1: 资产A2面临两个主要威胁T2,T3: 威胁T1可以利用资产 ...

最新文章

  1. ubuntu下安装gedit插件
  2. Socket recv()之前进行select代码
  3. JAVA-JAVA WEB开发工具下载与安装
  4. 程序猿的双十一最佳攻略
  5. 马斯克亲口承认:自动驾驶的开发难度超乎想象;小米再发1.2亿股权激励;Firefox Lite 已死|极客头条...
  6. Helm 3 完整教程(十):Helm 函数讲解(4)加密函数、编码和解码函数
  7. java常用框架集合
  8. ADAMS学习视频强力推荐--《Adams/ view从入门到提高》ftc正青春制作
  9. 新网域名转出及阿里云域名转入
  10. 计算机加域和用户权限分配关系,加入域需要什么样的权限?
  11. 数据结构——哈夫曼树及其应用
  12. 移动端rpx px,rem em区别
  13. WPS加载项系列(3)WPS项目部署
  14. 【python】pdf转png
  15. 使用autoware的calibration_toolkit联合标定双目相机和激光雷达(ZED and VLP-16)
  16. 学生宿舍管理系统之概念结构设计
  17. Codeforces Round #702 (Div. 3)D. Permutation Transformation
  18. 苹果手机字体大小怎么设置?简单实用,轻松学会
  19. 使用FPT上传下载文件和解决中文名文件乱码问题
  20. [讨论]日本地震对中国软件服务外包行业的影响分析(宏观)

热门文章

  1. php 三消算法,三消游戏关卡设计教程(初级篇)——基本地形设计
  2. FPGA串口传图sobel边缘检测
  3. 菜鸟python爬虫scrapy_Python爬虫(Scrapy)爬取秀人网
  4. MYSQL基础学习了解
  5. html设置自己下载的字体
  6. 系统的性能与压力测试
  7. Linux使用libmodbus源码开发,LibModbus源码分析
  8. 蓝光护目镜 v6.66.6.3
  9. SSH和SSM的区别
  10. ps如何把自己的图与样机结合_样机在ps里面怎么用|ps怎么把图片放在书本样机图中...