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

本文介绍了一种计算组合数C(m,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;
    }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值