C++ 代码实现定义法计算行列式的值
一、前言
最近在捣鼓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++ 代码实现定义法计算行列式的值相关推荐
- java之利用行列式展开法,计算行列式的值
一.提出问题 如何利用行列式展开法计算行列式的值 二.基本理论与操作说明 三.举例说明 1.代码 public class first {static int[][] geta(int m[][],i ...
- 用均值方差法计算边际VaR值和成分VaR值(Python)
tushare ID:432833 边际VaR值和成分VaR值定义 VaR:Value at Risks,在险价值,是指未来一段特定的时间内,在市场正常波动的情况下,某一金融资产或投资组合在给定置信水 ...
- crc16码表的使用_查表法计算CRC16校验值
CRC16是单片机程序中常用的一种校验算法.依据所采用多项式的不同,得到的结果也不相同.常用的多项式有CRC-16/IBM和CRC-16/CCITT等.本文代码采用的多项式为CRC-16/IBM: X ...
- crc16modbus查表法_查表法计算CRC16校验值
/******************************************************************************* * Copyright (c) 201 ...
- python3计算行列式的值(运用拉普拉斯展开法递归实现)
""" 递归(拉普拉斯展开)计算n阶行列式 传入的一定为"正方形" input: [ [1,2,3,4], [5,6,7,8], [9,1,2,3], ...
- c语言编写程序计算行列式值,求行列式的值,用C语言怎么写啊? 如何求行列式的值...
导航:网站首页 > 求行列式的值,用C语言怎么写啊? 如何求行列式的值 求行列式的值,用C语言怎么写啊? 如何求行列式的值 相关问题: 匿名网友: 行列式计算公式知道吧,给你个源码参考,大一时写 ...
- C语言用代数余子式计算行列式
本章主要介绍利用代数余子式计算行列的原理及代码实现 除了代数余子式法,其他计算行列式的方法如下: 1)利用高斯法计算行列式 2)利用LU分解法计算行列式 目录 1.代数余子式计算行列式的原理 二阶行列 ...
- 行列式求值、矩阵求逆
#include <iostream> #include <string> #include <assert.h> #include <malloc.h> ...
- 6*6行列式相加的c语言,求行列式的值,用C语言怎么写啊?
优质回答 回答者:徐州小可爱 行列式计算公式知道吧,给你个源码参考,大一时写的. #include #include #define MAX 9 /*定义最大为9阶行列式*/ int Fun(int ...
- 信息安全风险评估---矩阵法计算风险
矩阵法计算风险 假设:有以下信息系统中资产面临威胁利用脆弱性的情况: 共有两项重要财产:资产A1和资产A2: 资产A1面临一个主要威胁T1: 资产A2面临两个主要威胁T2,T3: 威胁T1可以利用资产 ...
最新文章
- 火灾自动报警系统及消防设施联动控制
- java把二维转换为一维_在R语言中什么函数可以将二维数组转换成一维数组
- HTTP错误404.3-Not Found
- URAL 1682 Crazy Professor (并查集)
- jquery ajax 数据传输
- UVA - 12412 ​​​​​​​A Typical Homework (a.k.a Shi Xiong Bang Bang Mang)
- Spring Boot MyBatis
- WAMP显示错误“MSVCR100.dll”缺少安装时
- viewer 获取当前显示的图片信息_通过这个 Runtime 统计信息可视化库学到了什么?...
- python网络编程 赵宏_【干货收藏】Python面试指南大全
- mysql架设手游_魔天屠龙传手游私服架设源码+大中控后台+搭建教程
- 魅族一直显示无服务器,魅族手机用久了卡顿,这三个方法轻松解决
- Java的sort用法深究,compare按照姓氏排序
- 为什么mysql默认事务隔离级别为RR
- 杰理之高低速(HSB/LSB)时钟硬件模块【篇】
- SSM+图书馆电子文件资源管理 毕业设计-附源码091426
- opencv 手选roi区域_【opencv学习笔记六】图像的ROI区域选择与复制
- 分布式事务之基础理论(CAID、CAP与BASE)
- 移远串口调试软件QCOM下载
- limbo运行veket linux,Veket Linux使用(非常适合老电脑的系统)