我在这里有两个共同计算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中。他们都必须检测到这种溢出。
目前,当我输入一个太大而无法计算的数字时,我会从命令行返回一个浮动类型错误。
我无法解决此溢出检查问题。任何帮助将不胜感激,谢谢。
答案 0 :(得分:0)
在您的代码中,最大值始终为factorial(n)
,
所以你只需要检查n!
是否大于2.147.483.647
(最大值)。
请注意,根据内存中int
类型的大小,存储的最大值可能会有所不同(不同的机器可以指定不同的大小)。
但是,int
类型变量中的最后一位保留用于存储符号(+
或-
),因此最大值可以是65.535
的一半, 4.294.967.295
32.767
和2.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;
}