K******g 发帖数: 1870 | 1 如果我要写个factorial的程序,即使用long long unsigned,也仍有可能溢出,请问
我怎么在程序运行中测试它,如果溢出了再做相应的处理? |
p******r 发帖数: 2999 | 2 int factorial(int n) {
int ret, tmp, i;
if (n < 0) return -1;
ret = tmp = 1;
i = 2;
while (i <= n) {
tmp *= n;
if (tmp < ret) return -1;
ret = tmp;
++ i;
}
return ret;
}
【在 K******g 的大作中提到】 : 如果我要写个factorial的程序,即使用long long unsigned,也仍有可能溢出,请问 : 我怎么在程序运行中测试它,如果溢出了再做相应的处理?
|
K******g 发帖数: 1870 | 3 这个不一定吧,溢出后的数一定比这次的数小?假如最大整数是10,这次为6,溢出后
,完全有可能在6-10之间啊。
【在 p******r 的大作中提到】 : int factorial(int n) { : int ret, tmp, i; : if (n < 0) return -1; : ret = tmp = 1; : i = 2; : while (i <= n) { : tmp *= n; : if (tmp < ret) return -1; : ret = tmp; : ++ i;
|
Z*****Z 发帖数: 723 | 4 geniusxsy说过这样一种方法:对于可能产生溢出的运算,拿结果进行逆运算进行验证。
具体在这里c = a * b,你不知道c是不是溢出了,就用c/a看看得不得b。
【在 K******g 的大作中提到】 : 这个不一定吧,溢出后的数一定比这次的数小?假如最大整数是10,这次为6,溢出后 : ,完全有可能在6-10之间啊。
|
p******r 发帖数: 2999 | 5 嗯,这个方法不错
判断大小只对int类型的加法有点效果
证。
【在 Z*****Z 的大作中提到】 : geniusxsy说过这样一种方法:对于可能产生溢出的运算,拿结果进行逆运算进行验证。 : 具体在这里c = a * b,你不知道c是不是溢出了,就用c/a看看得不得b。
|
w****r 发帖数: 1384 | 6 整数溢出后成负数了...
【在 K******g 的大作中提到】 : 这个不一定吧,溢出后的数一定比这次的数小?假如最大整数是10,这次为6,溢出后 : ,完全有可能在6-10之间啊。
|