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