Reverse Integer
Reverse digits of an integer.
Example1: x = 123, return 321
Example2: x = -123, return -321
这个题目的难度在于处理溢出
先贴出正确运行的代码:
int reverse(int x) { if(x == 0) return 0; int flag = 1; if(x < 0){ x *= -1; flag = -1; } long result = 0; while(x){ int temp = x%10; result = result*10+temp; if(result < 0) return 0; if(result > 2147483647) return 0; x /= 10; } result *= flag; return result; }
贴出一个错误的代码:result是int型,只有result<0的判断
int reverse(int x) { if(x == 0) return 0; int flag = 1; if(x < 0){ x *= -1; flag = -1; } int result = 0; while(x){ int temp = x%10; result = result*10+temp; if(result < 0) return 0; x /= 10; } result *= flag; return result; }
运行结果:
经过分析,9646324351的二进制的32位为0,34位为1,int型判断其是一个正数,截取后面32位,结果为1056389759
截取后32位:
如果用加上result > 2147483647判断,对于9646324351结果一样,因为result是截取后的数字,所以result不能定义为int型,定义为long型。
对于long型,如果去掉result > 2147483647判断的代码:
int reverse(int x) { if(x == 0) return 0; int flag = 1; if(x < 0){ x *= -1; flag = -1; } long result = 0; while(x){ int temp = x%10; result = result*10+temp; if(result < 0) return 0; //if(result > 2147483647) return 0; x /= 10; } result *= flag; return result; }
运行结果如下:
分析一下原因:虽然有result<0的判断了,但是对于long型,9646324315是一个正数,所以判断不起作用,输出的时候返回int型,所以也出错。
如果定义result为long型,只判断result > 2147483647,则出现如下的错误:
具体原因有待分析!