我有一个斐波那契递归函数:
int efib (int num) {
if (num == 0){
return 0;
}else if (num == 1){
return 1;
}else if (num == -1){
return -1;
}else if (num > 0){
return efib(num - 1) + efib (num - 2);
}else{
return efib (num + 1) + efib(num + 2);
}
}
我正在尝试找到int
值溢出的确切元素num
,是否可以获得当前递归值,以便将其与int
数据类型可以容纳的最大值进行比较?
我知道包含在斐波那契数列中的整数可以容纳的最大值是1836311903。
发布于 2018-10-25 09:35:34
我正在尝试找到int值溢出的确切元素(num)
为防止溢出,请在相加之前将两个操作数传递给OF test function。
它使用“将其与int数据类型可以容纳的最大值进行比较”。
#include <limits.h>
int is_undefined_add1(int a, int b) {
return (a < 0) ? (b < INT_MIN - a) : (b > INT_MAX - a);
}
....
// return efib(num - 1) + efib (num - 2);
int a = efib(num - 1);
int b = efib(num - 2);
if (is_undefined_add1(a, b)) {
fprintf(stderr, "fib[%d] was about to overflow\n", num);
exit(EXIT_FAILURE);
}
return a + b;
如果有更宽的类型(long
、long long
或intmax_t
),只需通过该类型添加并根据int
范围检查和即可。@Barmar
#if LLONG_MAX/2 >= INT_MAX && LLONG_MIN/2 <= INT_MIN
int is_undefined_add1(int a, int b) {
long long sum = a;
sum += b;
return sum < INT_MIN || sum > INT_MAX;
}
#else
// as above
#endif
https://stackoverflow.com/questions/52980045
复制相似问题