【发布时间】:2012-03-14 07:59:32
【问题描述】:
更新:
感谢您提供有用的 cmets 和建议。使用你们所说的,这就是我想出的:
#include <limits.h>
...
else {
int a = binom(n - 1, k - 1);
int b = binom(n - 1, k);
if(a > 0) {
if (b > INT_MAX - a) { // case 1: integer overflow
printf("int overflow\n");
return;
}
}
else if (b < INT_MIN - a) { // case 2: integer overflow
printf("int overflow\n");
return;
}
int c = a + b;
return c;
}
我还有一个问题。在上面的代码中,当我捕获整数溢出时,我没有返回一个值——它只是return;。
下面的其中一个 cmets 建议 return -1;,但是考虑到 -1 仍然是一个有效整数,这不起作用,对吗?
我不知道该怎么做,因为我的函数的返回类型是 int。 return; 工作还是有更好的方法?还建议使用exit(1);,但它会退出整个程序还是仅退出函数?
原文:
您的函数应该使用整数运算来确保结果准确且 还可以检测因超出最大允许值而导致的任何整数溢出。
我试图在计算二项式系数时捕获整数溢出。虽然是一个简单的概念,但让我感到厌烦的是,这不仅仅是一次性加法,而是一种不断执行求和的递归算法。
这是函数:
// recursive function to calculate binomial coefficients
int binom(int n, int k){
if(k == 0){ // base case
return 1;
}
else if (n == 0){
return 0;
}
else{
return binom(n - 1, k - 1) + binom(n - 1, k); // recursive call
}
}
在这种逻辑下,我假设 catch 应该在递归调用语句中。类似的东西:
if(binom(n-1, k-1) + binom(n-1,k)) causes overflow, return error, else proceed with binom(n-1, k-1) + binom(n-1,k)
【问题讨论】:
标签: c recursion integer overflow