行列式計算(程式設計實現)

2022-08-16 22:54:26 字數 3022 閱讀 6972

write programs that do one thing and do it well

-----  doug mcilroy (unix哲學)

如果你學過線代, 又恰巧你是個coder, 那麼你應該寫個計算行列式的program。

計算行列式(數學知識): 

每行都按行座標排序, 求出列座標排列的逆序數

根據逆序數的奇偶行判斷該項的正負(奇負, 偶正)

逐項求和。

說明: 輸入行列式的 行(列)數 n

並依次輸入n*n個數。 程式將輸出

行列式的計算算式,並得出結果!

**實現分析: 呼叫標頭檔案裡的庫函式 next_permutation()  具體實現細節詳見**。

用線段樹求逆序數時間複雜度為n*logn。 當然以這種時間複雜度的演算法還有樹狀陣列求逆序數, 歸併排序求逆序數。

當然你也可以用直接暴力的方法求出逆序數,**是十分簡單的。時間複雜度和插入排序相同n*n。

然後就是具體的一些實現細節啦

線段樹求逆序數, **有點長。

#include#include

#include

using

namespace

std;

void pushup(int cur, int *sum)

void build(int l, int r, int cur, int *sum)

void update(int p, int l, int r, int cur, int *sum)

int m = (l+r)>>1

;

if(p<=m) update(p, l, m, cur<<1

, sum);

else update(p, m+1, r, cur<<1|1

, sum);

pushup(cur, sum);

}int query(int l, int r, int l, int r, int cur, int *sum)

int m = (l+r)>>1

;

int ret = 0

;

if(l<=m) ret+=query(l, r, l, m, cur<<1

, sum);

if(r>m) ret+=query(l, r, m+1, r, cur<<1|1

, sum);

return

ret;

}int reverse(int n, int *p)

return

tot;

}void solve(int n, int a[15][15

]) ans-=temp;

}else

ans+=temp;}}

while(next_permutation(p, p+n));

printf(

"\n%d\n\n

", ans);

}int

main()

return0;

}

view code

歸併排序求逆序數:

歸併排序

void merge_sort(int * a, int x, int y, int *t)

for( i = x; i < y; i++) a[i] =t[i];

}}

稍加改動, 即可求逆序數。 把 「else t[i++] = a[q++]; 」 改成 「else 」 

即:

void merge_sort(int * a, int x, int y, int *t)

} for( i = x; i < y; i++) a[i] =t[i];

}}

如果想求順序數的個數, 直接用總情況數 (n-1+1)*(n-1)/2   - 逆序數   即可!

用歸併排序法----計算行列式

#include#include

#include

using

namespace

std;

int merge_sort(int * a, int x, int

y) }

}return

cnt;

}

void solve(int n, int a[15][15

]) ans-=temp;

}else

ans+=temp;}}

while(next_permutation(p, p+n));

printf(

"\n%d\n\n

", ans);

}int

main()

return0;

}

view code

稍加完善 ~ ~ ~

#include#include

#include

using

namespace

std;

//template

int merge_sort(int * a, int x, int

y) }

}return

cnt;

}

template

void solve(int n, tt a[15][15

]) ans-=temp;

}else

ans+=temp;}}

while(next_permutation(p, p+n));

cout

<

cout

<

\n\n行列式的結果為:

"}int

main()

return0;

}

view code

行列式的計算

很多知識點都生疏了,標記一下。對於任意階行列式的定義一般是由二階 三階行列式的定義引出來的。因為二階和三階恰好是個特例,我們直接引入標準定義。解釋說明 上圖中 7 式中的p1 p2 是元素下標。總結來說。行列式就是 在該數表中找到n組數,且這n組數中每一組中的每乙個元素都不同行不同列,然後每一組各自...

C實現矩陣行列式計算

開始重新學習數學了,然而路途總是不那麼平坦,儘管是先挑選的最簡單的線性代數,然而一開始就進展不順 當然我承認數學一直都是乙個難以言說的傷痛,但是像什麼三階行列式計算還是老是算錯我就有點難以忍受了 於是編寫乙個程式解決行列式的計算問題,記得好像當初學線性代數的時候也想過程式設計實現,最終好像因為水平問...

MyMathLib系列 行列式計算

靠人不如靠己,準備做自己得mathlib,在學校的時候,就想過把數學數理的東西都計算機化,但一直沒有時間去做這件事情,現在覺得空餘 時間比較閒,就做做這件事情,先從線性代數開始,畢竟這裡面的很多演算法,實際共走中都有用到。在做這些演算法的過程中,也體會到了 數學中的東西不是沒有用,而是你沒用到。下面...