一、前言

最近在捣鼓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. 火灾自动报警系统及消防设施联动控制
  2. java把二维转换为一维_在R语言中什么函数可以将二维数组转换成一维数组
  3. HTTP错误404.3-Not Found
  4. URAL 1682 Crazy Professor (并查集)
  5. jquery ajax 数据传输
  6. UVA - 12412 ​​​​​​​A Typical Homework (a.k.a Shi Xiong Bang Bang Mang)
  7. Spring Boot MyBatis
  8. WAMP显示错误“MSVCR100.dll”缺少安装时
  9. viewer 获取当前显示的图片信息_通过这个 Runtime 统计信息可视化库学到了什么?...
  10. python网络编程 赵宏_【干货收藏】Python面试指南大全
  11. mysql架设手游_魔天屠龙传手游私服架设源码+大中控后台+搭建教程
  12. 魅族一直显示无服务器,魅族手机用久了卡顿,这三个方法轻松解决
  13. Java的sort用法深究,compare按照姓氏排序
  14. 为什么mysql默认事务隔离级别为RR
  15. 杰理之高低速(HSB/LSB)时钟硬件模块【篇】
  16. SSM+图书馆电子文件资源管理 毕业设计-附源码091426
  17. opencv 手选roi区域_【opencv学习笔记六】图像的ROI区域选择与复制
  18. 分布式事务之基础理论(CAID、CAP与BASE)
  19. 移远串口调试软件QCOM下载
  20. limbo运行veket linux,Veket Linux使用(非常适合老电脑的系统)

热门文章

  1. RPGMAKER游戏引擎基于JavaScript的插件制作(一)——前期准备以及RPGMAKER内建逻辑
  2. 代码review总结
  3. FPGA串口传图sobel边缘检测
  4. Java LDAP统一身份认证
  5. docker搭建LDAP统一用户认证
  6. 小程序常用ui库 组件库
  7. win10如何检测计算机性能,win10系统怎么查看自己电脑性能
  8. LINUX udhcpc命令
  9. PTES Technical Guidelines
  10. ArcGIS/ArcMAP操作录屏视频及相关实验数据(行政界线、地名点、道路路网、水系、乡镇/街道面等)