首先
public int reverse(intx) {
int ans = 0;
while(x!=0) {
int temp = x%10;
x/=10;
ans = ans*10+temp;
}
returnans;
}
但是这样无法检验最终结果是否溢出。
我们可以看到,溢出的原因是ans*10+temp>MAX或ans*10+temp
对于正数,举个小点的例子,一个6bit的整数,范围在[-32,31],ans>3(31/10)的话,最小ans=4,乘10必然溢出,对应情况1。若ans<3,最大ans=2,乘10+9=29都不会溢出,对应不溢出情况。若ans=3,则分情况考虑,若temp>1,则溢出,temp<=1,则不会溢出,对应情况2。(真是个数学问题啊……要严格推导的话还要考虑向下取整,真的麻烦……)
于是对于正数,有:
1.ans>MAX/10时,ans*10+temp确定会溢出;
2.ans==MAX/10且temp>7时,ans*10+temp确定会溢出。
负数同理。
为什么是7呢。因为2^1=2,2^2=4,2^3=8,2^4=16;2^5=32,2^6=64,2^7=128,2^8=256……可以发现,4个一循环,分别个位是2,4,8,6。2^31对应的是8,则2^31-1个位是7。
故有:
public int reverse(intx) {
int ans = 0;
while(x!=0) {
int temp = x%10;
x/=10;
if(ans>Integer.MAX_VALUE/10||(ans==Integer.MAX_VALUE/10&&temp>7)) return 0;
if(ans
ans = ans*10+temp;
}
returnans;
}