[c++]關於倒轉32位int整數的範圍控制問題

來源:互聯網
上載者:User

標籤:max   解決   code   round   lin   返回   sem   溢出   還原   

題目來源:leetcode Reverse Integer

Given a 32-bit signed integer, reverse digits of an integer.

Example 1:            Example 2:          Example 3:

Input: 123             Input: -123         Input: 120

Output: 321          Output: -321       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.

 

思路: 

  • 考慮三種情況:
    1. 數值本身就溢出。
    2. 數值將要溢出,分界在未知數與INT_MAX位元相同。
    3. 數值在安全範圍內。
  • 解決方案:
    1. 先判斷溢出,若溢出直接返回0
    2. 邊位元壓縮,邊倒轉,判斷溢出,若溢出返回0
    3. 直接倒轉

前提處理:

 

1 int m=x,i=1,ten=1;//i記錄位元,ten記錄最高位元要*10的2 while(m/=10){ ++i;ten*=10;}3 if(i<10) m=reversemin(x,i,ten);4 else m=reversemax(x,i,ten);

 

 

 

 

判斷數值溢出:

1 unsigned int y = x;//擴大範圍
2 if(x<0) y=-x;
3 if(y>INT_MAX) return 0;

位元壓縮,並倒轉:

 1 int reversemax(int x,int i,int ten) 2 { 3     int sign=1; 4     if(x<0) {x=-x; sign=-1;}//負數變為正數,sign還原負數 5     int m=0,max=INT_MAX; 6     while (i--) { 7             int rest = x % 10; 8             int mrest=max/ten; 9             if(rest>mrest) return 0;//與INT_MAX位元壓縮,如果大於則已經溢出,返回010             else if(rest<mrest) break;//如果小於則進入了安全範圍,跳到安全的倒轉11             m += rest * ten;//只有在相等的情況才需要進行下一次比較12             x /= 10;13             max=max-mrest*ten;14             ten /= 10;15         }16     if(ten==0) return m*sign;17     ++i;//最後一次迴圈中止時,沒有操作,所以還原被刪去的位元18     19     while (i--) {//正常倒轉20             int rest = x % 10;21             m += rest * ten;22             x /= 10;23             ten /= 10;24         }25     return m*sign;26     27 }

!負數模數之後是負數,無法進行比較,所以先取正。

!判斷是否倒轉完,第16行,不能用位元,因為中斷出來位元也減了1

直接倒轉:

 

 1 int reversemin(int x, int i, int ten) 2     { 3         int m = 0; 4         while (i--) { 5             int rest = x % 10; 6             m += rest * ten; 7             x /= 10; 8             ten /= 10; 9         }10         return m;11 }

 

整體代碼:

 1 class Solution { 2 public: 3     int reverse(int x) { 4        unsigned int y = x; 5         if(x<0) y=-x; 6        if(y>INT_MAX) return 0; 7        int reversemin(int x, int i, int ten); 8        int reversemax(int x,int i,int ten); 9        int m=x,i=1,ten=1;10         while(m/=10){ ++i;ten*=10;}11         if(i<10) m=reversemin(x,i,ten);12         else m=reversemax(x,i,ten);13         return m;14     }15 };16 int reversemin(int x, int i, int ten)17     {18         int m = 0;19         while (i--) {20             int rest = x % 10;21             m += rest * ten;22             x /= 10;23             ten /= 10;24         }25         return m;26 }27 int reversemax(int x,int i,int ten)28 {29     int sign=1;30     if(x<0) {x=-x; sign=-1;}31     int m=0,max=INT_MAX;32     while (i--) {33             int rest = x % 10;34             int mrest=max/ten;35             if(rest>mrest) return 0;36             else if(rest<mrest) break;37             m += rest * ten;38             x /= 10;39             max=max-mrest*ten;40             ten /= 10;41         }42     if(ten==0) return m*sign;43     ++i;44     45     while (i--) {46             int rest = x % 10;47             m += rest * ten;48             x /= 10;49             ten /= 10;50         }51     return m*sign;52     53 }

 

[c++]關於倒轉32位int整數的範圍控制問題

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.