排列组合数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(nreturn c(m,m-n);
        for(int i=0;i1;
            temp/=i+1;
        }

        return (int)temp;
    }

你可能感兴趣的:(算法,java)