首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对计算ncr的解释

对计算ncr的解释
EN

Stack Overflow用户
提问于 2014-10-03 06:39:24
回答 2查看 242关注 0票数 0

当我看到这篇文章时,我正在阅读计算ncr的可能的有效方法。

Which is better way to calculate nCr

这里给出的第二个答案,我无法理解。守则是:

代码语言:javascript
复制
long long combi(int n,int k)
{
    long long ans=1;
    k=k>n-k?n-k:k;
    int j=1;
    for(;j<=k;j++,n--)
    {
        if(n%j==0)
        {
            ans*=n/j;
        }else
        if(ans%j==0)
        {
            ans=ans/j*n;
        }else
        {
            ans=(ans*n)/j;
        }
    }
    return ans;
}

这方面的复杂性又有多大?我试着做了一个例子,答案是正确的,但这些条件是什么呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-03 07:56:11

这只是优化的结果,它计算

代码语言:javascript
复制
n! / k! (n-k)! = n * (n-1) * ... (n - k + 1) / k * (k-1) * ... * 1

第一:算法优化:当C=C(N):计算条目较少的那个--不错。

下一步的计算优化:当计算ans * n / j时,尝试在进行操作之前简化分数-- IMHO,这一次是高度分散的,因为这是人类所做的事情(你和我计算的6 / 312345678 / 9)快,但是对于处理器来说,这种优化只是增加了多余的操作。

票数 0
EN

Stack Overflow用户

发布于 2014-10-03 07:46:54

作为链接中的状态,循环中的多个条件是在执行ans = (ans * n) / j时处理溢出。

因此,其功能是:

代码语言:javascript
复制
long long ans = 1;
k = std::min(k, n-k);
int j = 1;
for (; j <= k; j++, n--) {
    ans = (ans * n) / j;
}
return ans;

我们有C(n,r) = n!/(N)!r!大多数因素都可以简化。

复杂性是k

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26174333

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档