二项式系数函数C++错误答案 n>13

Binomial coefficient function C++ incorrect answer n>13

本文关键字:答案 错误 函数 C++ 二项式      更新时间:2023-10-16

我正在尝试学习C++,因此我正在尝试做一个函数来计算二项式系数。代码最高可达 n 的 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;
}

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

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

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

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

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

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

--------------------------------------------------------------------------------------
|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 库,但是在这种情况下,计算将花费更多时间,但会适合。