二项式系数函数C ++不正确答案n> 13

时间:2013-10-06 17:05:51

标签: c++ integer overflow binomial-coefficients

我正在尝试学习C ++,因此我正在尝试使用函数来计算二项式系数。代码最多可达到12的n,对于较大的值,生成的结果不正确。我很感激您的意见。

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;
}

3 个答案:

答案 0 :(得分:2)

int变量只能容纳一定数量的数字。这从编译器到编译器和平台到平台各不相同,但典型的限制大约为20亿。您的程序使用的数字大于此值,因此您会收到错误。

如果你想用大整数计算,答案就是得到一个大整数库。 GMP是一个受欢迎的。

答案 1 :(得分:1)

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

转换到更大的东西(unsigned long long,任何人?),或者使用bigint库,或者提出一个更好/更聪明的算法,不涉及计算大因子,至少不是直接算法。 / p>

答案 2 :(得分: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)&lt; = sizeof(int) = sizeof(unsigned int)&lt; = sizeof(long) = sizeof(unsigned long)&lt; = {{1 }} = sizeof(long long)

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