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

时间:2017-10-29 20:49:34

标签: c++ int range long-integer

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

SELECT

另一个是:

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);
}

所以当我运行(15,5)时,第二个给出正确答案,而第一个给出4.我知道对于choose_fac,当计算15时,int超出范围!但是如果这是原因,为什么choose_dp没有返回错误的答案,因为他们都使用int来定义函数?

非常感谢!

电子。

2 个答案:

答案 0 :(得分:3)

第一个溢出int

当您致电fac(15)计算choose_fac(15, 5)应该由该函数计算的值时,1,307,674,368,000大大超出int的范围。计算15 choose 5的最终结果将在int的范围内,因为两个相对较大的因子被划分,但中间结果中的错误会阻止此计算成功完成。

使用动态编程的第二个函数没有这个问题,因为它没有明确地计算阶乘。这种计算二项式系数的方法称为Pascal's Triangle

答案 1 :(得分:1)

当你返回fac(n)/ fac(k)/ fac(n-k)时;它从左到右进行评估。 ((fac(n))/ fac(k))/ fac(n-k))第一评估fac(n)给出溢出错误。