不许使用64位。
方法一
int reverse(int x){
int ret=0,tem=0;
while(x != 0){
tem = x % 10;
if(ret>214748364||ret == 214748364 && tem == 7){
return 0;
}
if(ret < -214748364|| ret == -214748364&&tem == -8){
return 0;
}
x = x / 10;
ret = ret * 10 + tem;
}
return ret;
}
方法二,使用unsigned 将ret转化从int转化为无符号数
当x为正数时,如果无越界的情况发生,一切正常,发生了越界后,unsigned 转换到int 会有一个类型转换。
如果x为负数时,如果无越界发生(鉴于无符号与有符号数之间的位模式不变)一切都可以顺利进行,如果发生越界,也会有一个转换。
int reverse(int x){
int ret = 0;
while(x){
int t = (unsigned)ret * 10;
if(t / 10 != ret){
return 0;
}
ret = t + x % 10;
x /=10;
}
return ret;
}
按照上面的这种非常优秀的方法,我将unsigned加入我之前报错的代码,得到了正确的结果
int reverse(int x){
int ret=0 ;
while(x != 0){
int tem = (unsigned) ret*10 + x % 10;
x = x / 10;
if(tem / 10 != ret){
return 0;
}
ret = tem;
}
return ret;
}
对的,我们做法几乎一样,由于我没有想到unsigned的使用,导致问题出现。
方法3:始终判断rev,是否小于INT_MIN /10 或是否大于INT_MAX /10,满足这个条件才能够接着计算,否者为0.
int reverse(int x){
int rev=0;
while(x){
if(rev<INT_MIN/10||rev>INT_MAX/10)
return 0;
rev = rev*10+x%10;
x=x/10;
}
return rev;
}