算法:求行列式 C语言实现
来源:互联网 发布:手机直播平台系统源码 编辑:程序博客网 时间:2024/04/28 02:04
兴趣来了,编写一个求行列式的程序,关键要解决两个问题
1)行列式列序号的全排列
2)行列式的符号
#include <iostream>#include <vector>using namespace std;#define LEN 3#define COUNT 3*2*1 // the count of premutation for length 3int idx[LEN] = { 0,1,2};int premus[COUNT][LEN+1]; // last elemet for store inversion numberint premus_pos = 0;int box[LEN][LEN] = { // sample data { 1, 2, 3 }, { 4, 5, 5 }, { 2, 4, 6 } };void arrayCopy(int src[], int dst[]) { for( int i=0; i<LEN; i++) dst[i] = src[i];}int inveNumber(int a[]){ // return inversion number int num = 0; for(int i=1; i<LEN; i++){ for( int j=0; j<i; j++){ if ( a[i] < a[j]) num++; } } return num;}void premu( int a[], int begin, int size) { // premutation if ( begin == size-1){ arrayCopy( idx, premus[premus_pos]); premus[premus_pos][LEN] = inveNumber(idx); for( int i=0; i<= LEN; i++) cout << " " << premus[premus_pos][i]; cout << endl; premus_pos++; return; } premu( a, begin+1, size); for(int i=begin+1; i< size; i++) { //switch first element int t=a[begin]; a[begin] = a[i]; a[i] = t; //recurisive premu( a,begin+1, size); //switch back a[i] = a[begin]; a[begin] = t; }}int main() { cout << "---go---" << endl; // get permeations premu(idx,0,LEN); cout << "premus_pos:" << premus_pos << endl; int result = 0; for(int i=0; i<COUNT; i++){ int item=1; for( int j=0; j<LEN; j++){ item *= box[j][premus[i][j]]; } // check sign if ( premus[i][LEN]%2 != 0) item = -item; result += item; } cout << "result is " << result << endl; return 0;}#include <iostream>#include <vector>using namespace std;#define LEN 3#define COUNT 3*2*1int idx[LEN] = { 0,1,2};int premus[COUNT][LEN+1]; // last elemet for store inversion numberint premus_pos = 0;int box[LEN][LEN] = { { 1, 2, 3 }, { 4, 5, 5 }, { 2, 4, 6 } };/*int box[LEN][LEN] = { { 1, 2 }, { 6, 7 } };*/void arrayCopy(int src[], int dst[]) { for( int i=0; i<LEN; i++) dst[i] = src[i];}int inveNumber(int a[]){ int num = 0; for(int i=1; i<LEN; i++){ for( int j=0; j<i; j++){ if ( a[i] < a[j]) num++; } } return num;}void premu( int a[], int begin, int size) { if ( begin == size-1){ arrayCopy( idx, premus[premus_pos]); premus[premus_pos][LEN] = inveNumber(idx); for( int i=0; i<= LEN; i++) cout << " " << premus[premus_pos][i]; cout << endl; premus_pos++; return; } premu( a, begin+1, size); for(int i=begin+1; i< size; i++) { //switch first element int t=a[begin]; a[begin] = a[i]; a[i] = t; //recurisive premu( a,begin+1, size); //switch back a[i] = a[begin]; a[begin] = t; }}int main() { cout << "---go---" << endl; // get permeations premu(idx,0,LEN); cout << "premus_pos:" << premus_pos << endl; int result = 0; for(int i=0; i<COUNT; i++){ int item=1; for( int j=0; j<LEN; j++){ item *= box[j][premus[i][j]]; } // check sign if ( premus[i][LEN]%2 != 0) item = -item; result += item; } cout << "result is " << result << endl; return 0;}int main() { cout << "---go---" << endl; // get permeations premu(idx,0,LEN); cout << "premus_pos:" << premus_pos << endl; int result = 0; for(int i=0; i<COUNT; i++){ int item=1; for( int j=0; j<LEN; j++){ item *= box[j][premus[i][j]]; } // check sign if ( premus[i][LEN]%2 != 0) item = -item; result += item; } cout << "result is " << result << endl; return 0;}
---- 输出如下--- 可以看了列序号为 0 1 2 的全排列和对应的逆序数
---go---
0 1 2 0
0 2 1 1
1 0 2 1
1 2 0 2
2 1 0 3
2 0 1 2
premus_pos:6
result is 0 // 当然是 0, sample data 中有两行对应成比例
- 算法:求行列式 C语言实现
- c语言实现求行列式值
- 用C语言编程递归求行列式的值
- 用C语言编程递归求行列式的值
- C语言求矩阵的行列式、伴随矩阵、逆矩阵
- 求des算法的c语言实现
- n阶行列式计算----c语言实现(完结)
- n阶行列式计算Python和C语言实现
- 递归求最大最小值算法 分治策略(c语言实现)
- C语言实现cordic算法求sin和cos值
- C语言算法---求鞍点
- python实现矩阵求行列式的值
- 求行列式
- C语言实现求圆周率
- [算法]求质数的算法之Miller-Rabin算法,C语言实现
- 矩阵的转置和行列式等操作的c语言实现
- 递归算法——求Fibonacci数列前n项(Java实现&C语言实现)
- C语言求质数的算法
- 一旧时钟时针与分针每隔66分钟重合一次,如早上7点将时针校准,到第二天早晨时针再次指向7点时
- 移动号段
- 中国诺贝尔物理学奖所有获得者名单(转)
- Win7系统安装SQL Server 2008后无法连接数据库引擎
- 虚表
- 算法:求行列式 C语言实现
- visual studio 2010卸载
- 音乐,代码,纯爱
- ping的工作流程(转)
- windows下java环境的配置
- 如何做一个让开发人员看得起的测试人员(转),写的很好。。。
- 凯 易 讯 2013 校招测试
- 上文中所需的list样式
- css流体盒布局解释