二项式系数函数C ++的不同输出

埃莉诺

我使用两种方法来计算二项式系数。一个是

int fac(int n) {
if ( n < 2 ) return 1; // return 1 when n=0,1
int ret = 1;
for(int i=2; i <= n; ++i)
    ret *= i;  // calculate factorial
return ret;
}
int choose_fac(int n, int k) {
  return fac(n)/fac(k)/fac(n-k);
}

另一个是:

int choose_dp(int n, int k) {
  int C[n+1][k+1];
  int i, j;
  for (i = 0; i <= n; i++) {
        for (j = 0; j <= min(i, k); j++) {
            if (j == 0 || j == i) C[i][j] = 1;
            else C[i][j] = C[i-1][j-1] + C[i-1][j];
        }
  }
  return C[n][k];
}

因此,当我在(15,5)上运行时,第二个给出正确的答案,而第一个给出4。我知道对于select_fac,计算15时int超出范围!但是,如果这是原因,为什么select_dp不会因为它们都使用int来定义函数,所以不会返回错误的答案吗?

非常感谢!

E.

谢尔盖·卡里尼琴科(Sergey Kalinichenko)

第一个溢出int

调用fac(15)计算choose_fac(15, 5)该函数应计算的值时,1,307,674,368,000大大超出的范围int计算的最终结果15 choose 5将在的范围内,int因为将两个相对较大的阶乘进行了划分,但是中间结果中的错误使该计算无法成功完成。

使用动态编程的第二个函数不会出现此问题,因为它没有显式计算阶乘。这种计算二项式系数的方法称为Pascal三角形

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章