1. 程式人生 > >排列組合數C(m,n)的O(n)演算法

排列組合數C(m,n)的O(n)演算法

剛開始,想用它的定義來做

C(m,n) = m!/(m-n!*n!)

但是發現如果用int的話,階乘的運算到13就爆int了,所以算這個不要寫一個階乘函式然後讓他們運算,而是應該先化簡後再來計算。

化簡之後我發現其實算C(m,n)只要計算min(n,m-n)次就可以了
程式碼如下

private static int c(int m,int n){
//temp 為答案
        double temp = 1;
//保證n>=m-n
        if(n<m-n)
            return c(m,m-n);
        for(int
i=0;i<m-n;++i){ temp*=n+i+1; temp/=i+1; } return (int)temp; }