算法:求行列式 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 中有两行对应成比例



原创粉丝点击