排列组合数C(m,n)的O(n)算法

来源:互联网 发布:怎么加雷盾网络验证 编辑:程序博客网 时间:2024/05/02 01:27

刚开始,想用它的定义来做

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;    }
0 0
原创粉丝点击