计算ncr的说明
Explanation for calculating ncr
我正在阅读可能有效的计算方法当我看到这篇帖子时,ncr
。
哪种方法计算nCr 更好
这里给出的第二个答案,我不明白。代码为:
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;
}
这其中的复杂性是什么?我试着用一个例子来做,结果是对的,但这些条件是什么?
这只是优化的结果,它计算
n! / k! (n-k)! = n * (n-1) * ... (n - k + 1) / k * (k-1) * ... * 1
第一:算法优化:当Cn k=Cn(n-k)时:计算项较少的项-很好。
下一步的计算优化:当计算ans * n / j
时,在进行运算之前尝试简化分数-IMHO,这一次是高度不可讨论的,因为这是人类会做的事情(你和我计算的6 / 3
比12345678 / 9)
更快,但对于处理器来说,这种优化只会添加多余的运算。
作为链接中的状态,循环中的多重条件是在执行ans = (ans * n) / j
时处理溢出。
所以功能是:
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)!r,并且大多数因素都可以被简化。
复杂度为k
。
相关文章:
- 当使用通配符和null指针调用函数时,对输出的说明
- 关于C++中具有多重继承"this"指针的说明
- 16 位到 10 位转换代码说明
- C++ 基本 CTOR 说明 - 为什么不调用赋值/复制构造函数
- 编译器指出结构和 int 说明的错误 2059
- 随机数生成函数说明
- 赋值到类型和空大括号. 语法说明
- C++ switch 语句:对案例进行分组,并针对每个案例给出特定的说明
- 标准对此指向成员函数类型模板参数有何说明?是我的代码有误,还是 MSVS 16.6 有问题?
- std::extent 实现详细信息说明
- 您好,我实际上想了解以下代码.有人可以详细说明代码它到底在做什么吗?为什么它会在第 31 行崩溃
- 如何理解"Temporary objs are destroyed as the last step in evaluating the full-expression"?谁能用一些简单的例子来说明这
- 有没有办法我可以在 C++ 中使用 if 语句来说明如果一个字符串不是两个名称的 eqal,它会给出一个输出,ATM i
- 有没有办法在c ++中清除空数组,请检查下面的代码以获取说明
- 使用英特尔内部函数 (AVX) 中的混合说明
- 复印作业操作员说明
- 如何获得西格玛 NcR 模组1000000007
- OpenCV on_low_height_thresh_trackbar() 参数说明
- C 程序结果说明
- 计算ncr的说明