解题思路
本来写的代码必须用long不然老是会越界,根据官方题解写了个不用int,下面是我对于此程序的理解。
代码注意
一定要注意你想要的是越界了返回0,但要注意一旦越界就直接编译错误了!
所以要在不越界的情况下比较出要越界的情况进而在其还未越界之前就直接返回0.
此方法好在其巧妙的利用了“设想下一步”,即在下一步还未运作之前先看一下他会是啥样的。若是下一步会越界则直接不会进行了。且其在“设想下一步”这一比较法时也很巧妙,即不真正的在最大值的危险边缘进行比较试探,因为那样若出现了越界则也会编译错误,他是运用分步的方法,即将越界的原因分出来,再将每一步越界的原因需要的条件分出来再一一去比较。如下列代码中第一个if语句,他为了叙述“进行下一次操作的result是否会越界”,先利用除法比较result与INT MAX 除了个位的每一项,因为后面result会乘10,所以此法比较了乘10的result和真正的INT MAX的除了个位的数,但又不是在乘10的那种危险情况下。且个位数字也是要比较的,而什么时候要比个位数字呢?自然是得INT MAX除了个位的数字都与result一样才可,因为若result直接大于他的除了个位数字的数的话会直接返回0。所以又分了一个if的情况。
```c
int reverse(int x){
int result = 0;
while (x != 0) {
int i = x % 10;//反转法,利用计算机取余和除法性质即可
x /= 10;
if (result > INT_MAX/10 || (result == INT_MAX / 10 &&i > 7)) return 0;
//注意这里INT_MAX为2的31次方-1,这里除以10是因为下面result还要
//乘10,所以这里比较除以10的即可。且用除法的INT_MAX,所以即比较的为他的不带个位的数字。
if (result < INT_MIN/10 || (result == INT_MIN / 10 && i < -8)) return 0;
//注意这不包含等于哦
result = result * 10 + i;//注意两个if语句要放前面然后再执行这个可能越界的句子
} //这样如果前面判断出要越界了就直接不会执行这个越界语句防止编译出错。
return result;
}
//注意在不用此法时之所以会越界的原因是result10越界了,所以即result10>=INT_MAX了,之所以有等于情况是因为i为原先的首位数字必不可为0。由于除法原因所以当大于INT MAX/10的不带个位数字时直接应该返回0 了,而当等于时就要考虑最后加的i这个变成的个位数字,由于2的31次方为2147483648可知,分两种情况,一种大于INT MAX 的,一种小于INT MIN-1 的.
。