二项式系数

binomial coefficient

本文关键字:二项式      更新时间:2023-10-16

我有一个计算二项式系数的代码,但是当数字大于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是不正确的

您的bin功能计算阶乘。21的阶乘不适合long

您已经依靠实现细节了。long仅需要32位,但是在您的系统上是64。如果仅是32位,那么您会尽快失败。

20!= 2432902008176640000,远远超出了long int所容纳的(通常为2147483647)。改用double

您正在使用

计算n的阶乘
bin(n);

当n> =20。

正如@stevejessop在评论中指出的那样,即使您使用无签名的长长(最长的定点类型),您也会覆盖极限来自0 to 18446744073709551615

您可以使用int-array存储您的结果,作为详细的在此处