-1

我正在尝试学习 C++,因此我正在尝试做一个函数来计算二项式系数。该代码的最高值为 12,对于较大的值,生成的结果不正确。我很感谢你的意见。

long double binomial(int n, int k) {
int d = n-k;
int i = 1, t = 1, n1 = 1, n2 = 1;
if (d == 0) {
    return 1;
} else if (n==0) {
    return 1;
} else {
    while (i <=n) {
        t *= i;
        if (i == d) {
            n1 = t;
            cout << t;
        }
        if (i == k) {
            n2 = t;
            cout << t;
        }
        i++;
    }
}
return t/n1/n2;
}
int main() {
int n, k;
cout << "Select an integer n: \n";
cin >> n;
cout << "Select an integer k: \n";
cin >> k;

long double v = binomial(n,k);
cout << "The binomial coefficient is: " << v << "\n";
return 0;
}
4

3 回答 3

2

int变量只能容纳一定大小的数字。这因编译器和平台而异,但典型限制约为 20 亿。您的程序使用的数字大于该数字,因此您会出错。

如果你想用大整数计算答案是得到一个大整数库。GMP是一种流行的方法。

于 2013-10-06T17:09:35.127 回答
1

如果int在您的系统上是 32 位长(现在很常见),那么 13 的阶乘不适合它(6227020800 > 2147483647)。

要么过渡到更大的东西(unsigned long long有人吗?),或者使用 bigint 库,或者提出一个更好/更聪明的算法,它不涉及计算大阶乘,至少不直接计算。

于 2013-10-06T17:09:57.030 回答
0

其中一个建议是使用其他类型。

这是整数类型、大小和限制的列表。

--------------------------------------------------------------------------------------
|type               |size (B)|Limits                                                 |
--------------------------------------------------------------------------------------
|long long          |8       |–9,223,372,036,854,775,808 to 9,223,372,036,854,775,807|
--------------------------------------------------------------------------------------
|unsigned long long |8       |0 to 18,446,744,073,709,551,615                        |
--------------------------------------------------------------------------------------
|int                |4       |–2,147,483,648 to 2,147,483,647                        |
--------------------------------------------------------------------------------------
|unsigned int       |4       |0 to 4,294,967,295                                     |
--------------------------------------------------------------------------------------
|short              |2       |–32,768 to 32,767                                      |
--------------------------------------------------------------------------------------
|unsigned short     |2       |0 to 65,535                                            |
--------------------------------------------------------------------------------------
|char               |1       |–128 to 127                                            |
--------------------------------------------------------------------------------------
|unsigned char      |1       |0 to 255                                               |
--------------------------------------------------------------------------------------

注意 longint通常是相同的大小。

请注意,这些限制在所有架构上都不相同,标准只保证关于可变大小的两件事:

  1. 1 = sizeof(char)=sizeof(unsigned char)
  2. 2 = sizeof(shor)= sizeof(unsigned short)<= sizeof(int)= sizeof(unsigned int)<= sizeof(long)= sizeof(unsigned long)<= sizeof(long long)=sizeof(unsigned long long)

另一种选择是使用bigint库,但是在这种情况下,计算会花费更多时间,但会很合适。

于 2013-10-09T12:32:45.570 回答