C语言展开法和全排列法实现n阶行列式计算
在这里向大家介绍两种实现n阶行列式计算的方法
目录
1.展开法
2.全排列法
一.展开法:
展开法的实现思想就是利用递归不断将行列式某一行或者某一列的n-1个(假设行列式为n行n列)置为0,剩余一个置为1,并不断展开进行计算,接下来让我们来看看代码
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
double Getnum(double arr[][20], int n)
{if (n == 1)return arr[0][0];if (n == 2) //若行列式行列数只剩下2,则使用交叉相乘计算并返回值return arr[0][0] * arr[1][1] - arr[0][1] * arr[1][0];for (int i = 0; i < n; i++){arr[i][n - 1] = arr[i][n - 1] / arr[n - 1][n - 1]; //将arr[n-1][n-1]赋值为1}double flag = arr[n - 1][n - 1]; //将最后一行的值赋为0(除最后一个数之外)for (int i = 0; i < n ;i++)for (int j = 0; j < n-1; j++){arr[i][j] = arr[i][j] - arr[i][n-1] * arr[n-1][j]; //原理为将行列式每一列与k倍(n-1)列相减,其中k值为最后一行的第j列元素,当循环到最后一行时,// 因为arr[n-1][n-1]等于1,所以最后一行的n-1个元素结果会为0}return flag * pow(-1.0, 2*n - 2)*Getnum(arr, n - 1); //行列数减少一,进入新的行列式展开
}int main()
{int n;double arr[20][20]; //存储行列式的值int i = 0;int j = 0;scanf("%d", &n);for (i = 0; i < n;i++)for (j = 0; j < n; j++){scanf("%d", &arr[i][j]);}double result = Getnum(arr, n); //获取行列式计算结果printf("%.0f\n", result);return 0;
}
二.全排列法
全排列法的实现思想也是递归,将各行不同列的元素实现所有的排序方式并进行计算相加,接下来也让我们来看看代码
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>int result = 0; //定义全局变量记录行列式的值void Swap(int *a, int *b) //交换数值
{int temp = *a;*a = *b;*b = temp;
}int Mark(int No[],int n) // 判断行列式相乘的符号正负
{int i = 0;int j = 0;int count = 0;for (i = 0; i < n - 1;i++)for (j = i+1; j < n; j++){if (No[i] > No[j]) //按照相乘数列顺序不同列计算逆序数{count++;}}if (count % 2) {return 1;}elsereturn 0;
}void GetResult(int value[][20],int No[], int k, int n)
{int sum = 1; //记录每次计算的值if (k == n - 1){for (int i = 0; i < n; i++){sum *= value[i][No[i]]; //无论全排列下标的值如何,相乘数之间的列数肯定不同}if (Mark(No,n)) //获取符号正负{sum *= -1;}result += sum; }for (int i = k; i < n; i++) //将行列式下标值前n个值进行实现全排列{Swap(&No[k], &No[i]);GetResult(value,No, k + 1, n);Swap(&No[k], &No[i]);}}int main()
{int n;printf("请输入阶数: ");scanf("%d", &n); // 行列式阶数int value[20][20]; // 存储行列式的值 int No[20]; // 记录行列式下标值for (int i = 0; i < n; i++){No[i] = i; //为行列式下标赋值}for (int i = 0; i < n; i++){printf("请输入第%d的值", i + 1);for (int j = 0; j < n; j++){scanf("%d", &value[i][j]); //为行列式赋值}}GetResult(value,No,0,n); //获取行列式的值printf("行列式的值为:\n");printf("%d\n ", result);
}
C语言展开法和全排列法实现n阶行列式计算相关推荐
- n阶行列式计算----c语言实现(完结)
花了半天时间,写了这个n阶行列式计算的程序,应该算是比较优美吧,有很多地方多次做了优化,程序占用内存不是很大,要是说小吧,也不合适,因为里边有一个递归,而且递归的深度还比较深.时间复杂度具体没有细看, ...
- 线性代数行列式计算之元素拆分与凑项法
线性代数行列式计算之拆分凑项法 声明与简介 线性代数行列式计算之拆项法与凑项法是行列式计算里的小技巧,拆项法是能应用行列式可变成多个行列式的性质,凑项法则是将现有行列式凑成拆项法以便计算最终结果. 拆 ...
- R语言编写自定义函数计算R方、使用自助法Bootstrapping估计多元回归模型的R方的置信区间、可视化获得的boot对象、估计单个统计量的置信区间、分别使用分位数法和BCa法
R语言编写自定义函数计算R方.使用自助法Bootstrapping估计多元回归模型的R方的置信区间.可视化获得的boot对象.估计单个统计量的置信区间.分别使用分位数法和BCa法(Bootstrapp ...
- 梯形法 微积分 c语言,关于 用辛普森法和梯形法求微积分的 程序!
共回答了8个问题采纳率:87.5% 1. 目的: (1)通过求定积分的程序设计,使学生理解和掌握C++语言的函数.函数指针等设计方法,培养学生综合利用C++语言解决数学计算问题,使学生将所学知识转化为 ...
- C语言冒泡法和选择排序法
C语言冒泡法和选择排序法 1.冒泡法代码 #include<stdio.h> int main() {int a[3];int p,i,tmp;for(i=0;i<3;i++)sca ...
- 选择排序法和冒泡排序法
选择排序法和冒泡排序法 1.选择排序法(以从小到大排序为例) 算法思想: A.在未排序序列中找到最小(大)元素,存放到排序序列的起始位置 B.从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序 ...
- 数据结构源码笔记(C语言):分块法查找
//实现分块法查找的算法#include<stdio.h> #include<malloc.h> #include<malloc.h>#define MAXL 10 ...
- Algorithm:C++语言实现之贪心法算法相关问题
Algorithm:C++语言实现之贪心法算法相关问题 目录 一.贪心法 一.贪心法 1.LIS的算法分析
- 操作系统之进程调度——优先权法和轮转法(附上样例讲解)
操作系统之进程调度--优先权法和轮转法(附上样例讲解) 操作系统之银行家算法-详解流程及案例数据 操作系统之多线程编程-读者优先/写者优先详解 操作系统之存储管理--FIFO算法和LRU算法 操作系统 ...
最新文章
- 大众点评开源监控CAT概览
- CPU是怎样制造的?解析intel Core i7生产全过程
- 开工的欲望 | AI Studio上线新功能,用你的模型生成在线预测服务
- php ci model条件查询,Laravel关系模型指定条件查询方法
- 023 -uniApp
- 23. PHP include and require 文件
- 实现微信摇一摇部分功能
- gif android 点击 加载,Android两种简单的加载GIF图片的方法
- chromeOS介绍
- 用Excel做时间顺序的行为流程图
- jzoj4245. 【五校联考6day2】er (B组——Day11)
- c语言中ifelse语句的例子,ifelse语句例子
- 京东商品长图功能来啦 不用改图一键生成长图
- Mac电脑优点是什么,缺点是什么?
- 迎国庆,2021新款苹果 iPad,包邮送一台!
- php计算问卷分数,php 问卷调查结果统计
- python爬取电影天堂
- Nginx+FFmpeg rtsp转flv实时预览
- Wiznote—为知笔记在Ubuntu上的安装
- cmatrix黑客帝国屏保
热门文章
- Microsoft Visual Studio Installer Projects下载缓慢下载不动的解决办法
- 高性能架构学习路线图-分布式架构演进
- word+正则表达式==快速批量添加图注题注(保姆级图文)
- 线性代数学习笔记——习题课——特征值与特征向量
- webrtc 的回声抵消(aec、aecm)算法简介(转)
- 剖析Android开发未来的出路在哪里,这原因我服了
- duck typing java_進一步思考Duck typing
- Linux服务器集群LVS
- (25):SPA单页面的理解
- 一文教你搞懂C语言的Q格式使用