最近做了一道題目:
Given a 32-bit signed integer, reverse digits of an integer.
Example 1:
Input: 123
Output: 321
Example 2:
Input: -123
Output: -321
Example 3:
Input: 120
Output: 21
Note:
Assume we are dealing with an environment which could only store integers within the 32-bit signed integer range: [?231, 231 ? 1]. For the purpose of this problem, assume that your function returns 0 when the reversed integer overflows.
來源:https://leetcode.com/problems/reverse-integer/
先貼上自己醜陋的代碼:
1 classSolution {2 public:3 int reverse(intx) {4 bool isNegative=false;5 if(x==0||xpow(2,31)-1)6 return 0;7 if(x<0){8 isNegative=true;9 x=-1*x;10 }11 while(x%10==0)12 x=x/10;13 int ans=0,temp;14 temp=x-(x/10)*10;15 while(x>=1&&ans=1)22 return 0;23 if(isNegative)24 ans=ans*(-1);25 returnans;26 }27 };
(單從速度角度來看,好像還可以?).

但是看到了讨論區一個意大利大佬的代碼,确實是short and element:
1 public int reverse(intx) {2 int prevRev = 0 , rev= 0;3 while( x != 0){4 rev= rev*10 + x % 10;5 if((rev - x % 10) / 10 !=prevRev){6 return 0;7 }8 prevRev =rev;9 x= x/10;10 }11 returnrev;12 }
不像我傻傻地用pow判斷溢出,這段代碼的判定語句很特别:
if((rev - x % 10) / 10 !=prevRev){
return 0;
我放到vs裡測試了一下,列印了結果出來。
測試代碼:
cout << rev <
rev= rev * 10 + x % 10;
cout<< "afterchange:" << rev << endl;
結果:
關鍵是最後一行,應該是9646324351的結果變成了1056389759.這應該就是Int溢出的結果。
通過查找網絡資料,看到有一個答案說的是對的(https://zhidao.baidu.com/question/1899917410883143460.html?qbl=relate_question_0&word=C%2B%2B%20Int%D4%CB%CB%E3%B3%AC%B3%F6%B7%B6%CE%A7)
C語言int占4個位元組,一共32位,範圍是-2147483648 ~ 2147483647。
如果超出這個範圍,就會加上或減去4294967296,使得值還落在這個範圍内。
比如定義int變量a的值為2147483647,再加1就是2147483648,超出範圍,是以需要減掉4294967296,最後列印的值就是-2147483648
實際上,1056389759就是9646324351-2*4294967296.也就是減去了兩倍的“模長”。不像一開始就輸入一個超出Int範圍的整數時的情況,編譯器不會發現超出範圍、不會報錯(因為這更像一個邏輯錯誤,是運作中産生的),隻會在運作的過程中通過“減模長”的形式使其在範圍内。是以,之後判斷Int超出時,可以使用一個整數來配合檢查,其的作用是儲存變換之前的整數,以此和變換後的整數通過變換公式來檢查變換是否正确,如果變換發生了異常,則說明超出了範圍。當然,也可以通過一個Long來儲存正确結果,通過和這個Long的數值比較來确定有沒有出現問題。但是這樣的話好像就沒有太大意義了(笑~)