检测nCr函数中的溢出

时间:2015-07-25 12:09:54

标签: c function error-handling ncr

我在这里有两个共同计算nCr的函数:

int factorial(int n) {
int c;
int result = 1;

 for (c = 1; c <= n; c++)
 {
  result = result*c;

 }

return result;
}




int nCr(int n, int r) {
int result;

 result = factorial(n)/(factorial(r)*factorial(n-r));

 return result;
}

我遇到了需要执行错误检查的问题。随着n越来越大,我没有能力计算机n!并且此错误检查必须存在于nCr和factorial中。他们都必须检测到这种溢出。

目前,当我输入一个太大而无法计算的数字时,我会从命令行返回一个浮动类型错误。

我无法解决此溢出检查问题。任何帮助将不胜感激,谢谢。

2 个答案:

答案 0 :(得分:0)

在您的代码中,最大值始终为factorial(n)
所以你只需要检查n!是否大于2.147.483.647(最大值)。

请注意,根据内存中int类型的大小,存储的最大值可能会有所不同(不同的机器可以指定不同的大小)。

但是,int类型变量中的最后一位保留用于存储符号(+-),因此最大值可以是65.535的一半, 4.294.967.295 32.7672.147.483.647 int类型。

SIZE_OF_INT(bits)    MAX VALUE(UNSIGNED)     MAX_VALUE(SIGNED)
---------------------------------------------------------------
16                   65.535                  32.767
32                   4.294.967.295           2.147.483.647

值13!可以超出int类型的最大值(32位)。

12! = 479.001.600 and
13! = 6.227.020.800

因此,您需要检查nCr(int n, int r) n的最大值是否始终小于13 (i.e. n<=12)r<=n。 在factorial(int n)n<=12

答案 1 :(得分:0)

计算二项式系数的更好方法

typedef unsigned long long ull;

ull nCr(int n, int r) {
    ull res = 1;
    if (r > n - r) r = n - r;
    for (int i = 0; i < r; ++i) {
        res *= (n - i);
        res /= (i + 1);
    }
    return res;
}