二项式系数

时间:2012-10-31 11:13:05

标签: c++ binomial-coefficients

我有一个计算二项式系数的代码,但是当数字大于20时,它开始计算错误,问题出在哪里?感谢

#include <iostream>
using namespace std;

long int bin(long int x)
{
    if(x==0)
        return 1;
    long int r = x;
    for(int i = r-1;i>0;i--)
    {
        r = r*i;
    }
    return r;
}
int main()
{
    cout << "Write n and k: " << endl;
    long int n=0;
    long int k=0;
    cin >> n;
    cin >> k;
    long int result = 0;
    long int fn = bin(n);
    long int fk = bin(k);
    long int fnk = bin(n-k);


    result = fn/(fk*fnk);

    cout << endl << "C = " << result << endl;


    return 0;
}

例如12和5 = 792这是正确的,但20和4 = -2是不正确的

3 个答案:

答案 0 :(得分:2)

您的bin函数计算阶乘。阶乘21不适合long

您已经依赖于实施细节。 long只需要32位,但在你的系统上它是64位。如果只有32位,那么你就会很快失败。

答案 1 :(得分:2)

20! = 2432902008176640000,远远超出long int可以容纳的范围(通常为2147483647)。请改用double

答案 2 :(得分:2)

您正在使用

计算n的阶乘
bin(n);

当n>&gt; = 20时,您正在超过long的限制。

正如@SteveJessop在评论中指出的那样,即使你使用了 unsigned long long (最长的定点类型),你也会超出限制范围 来自0 to 18446744073709551615

您可以使用int-array将结果存储为详细的 here