Problem 7:Reverse Integer
Reverse digits of an integer.
Example1: x = 123, return 321
Example2: x = -123, return -321
补充
C++中int类型变量的表示范围为:-2147483648~2147483647。为什么是这个范围呢?我们知道int有32位,最高那位是符号位。注意下面说的都是原码表示,假如符号位为0,剩余的全为1,那么这个数就是2147483647,也就是int能表示的最大整数,假如符号位为1,剩余的也全为1,那么这个数就是最小的负数,也就是-2147483647。
但其实int的最小负数是-2147483648,这是一个特殊的数字,它的原码是10000000000000000000000000000000(31个0),补码也是这个。
对于原码补码用一句话总结:确定范围看原码,表示及运算用补码。
也就是说,计算机中表示一个数都是表示成补码形式,比如下面代码:
int a = 0x7fffffff;//定义a的值为0x7fffffff(补码),其实就是int的最大数。
再比如:
int a = 0x7fffffff;
int b = a+1;//此时b的补码为1000...(31个0),也就是最小的负数
下面看一个坑:
if(0 < -2147483648)
{
cout<<"0 < -2147483648"<<endl;
}
else
{
cout<<"0 >= -2147483648"<<endl;
}
它输出:0 < -2147483648
再看下面代码:
int MIN = -2147483648;
if(0 < MIN)
{
cout<<"0 < -2147483648"<<endl;
}
else
{
cout<<"0 >= -2147483648"<<endl;
}
它输出:0 >= -2147483648
解题思路:
该题就是将输入的数逆置,输入的数可以是负数且在int范围内。其实该题目关键是要解决逆置后溢出问题,由于题目超出int范围就算溢出规定输出0,那么我们可以用long long保存逆置结果再判断是否超出int范围就行。不过判断溢出的时候有个坑就是上面说的。
参考代码:
class Solution {
public:
int reverse(int x) {
int flags = 0;
if(x < 0)
{
x = -x;
flags = 1;
}
stack<int> st;
int a;
while(x != 0)
{
a = x % 10;
x /= 10;
st.push(a);
}
long long result = 0;
long long base = 1;
while(!st.empty())
{
result += st.top() * base;
if(isOverflow(result)) return 0;
st.pop();
base *= 10;
}
if(flags == 1) result = -result;
return result;
}
private:
bool isOverflow(long long x){
int MAX = 2147483647;
int MIN = (int)-2147483648;
if(x > MAX) return true;
if(x < MIN) return true;
return false;
}
};
转载请注明原文地址:http://blog.csdn.net/u012619640/article/details/48422567