【问题标题】:Binomial coefficient function C++ incorrect answer n>13二项式系数函数 C++ 错误答案 n>13
【发布时间】:2013-10-13 05:44:08
【问题描述】:

我正在尝试学习 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;
}

【问题讨论】:

  • 听起来像是整数溢出。
  • 有趣的是,这里唯一可观的数字是 ret-val,long double。所有其他都是常规的int 值。我认为这是解决问题的尝试,顺便说一句,john 和 H2CO3 都正确识别。

标签: c++ integer overflow binomial-coefficients


【解决方案1】:

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

如果你想用大整数进行计算,答案是获得一个大整数库。 GMP 很受欢迎。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 谢谢!以为我检查过我用 long 表示大数字:/
    【解决方案3】:

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

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

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

    【讨论】:

    • 在我使用过的每个平台上,long 和 int 的大小都不同。
    猜你喜欢
    • 2019-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-29
    • 1970-01-01
    • 2023-02-20
    相关资源
    最近更新 更多