博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[c++]关于倒转32位int整数的范围控制问题
阅读量:6910 次
发布时间:2019-06-27

本文共 2796 字,大约阅读时间需要 9 分钟。

题目来源: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

!负数取模之后是负数,无法进行比较,所以先取正。

!判断是否倒转完,第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

 @jm_epiphany


 

2019-03-23 新更新内容:之前一直没有看别人的解法,发现这样太过繁琐了,java中int是用补码表示的,当这个数超出范围时,他肯定和之前的码不一样了,判断不一样即可

1 public int reverse(int x) 2 { 3     int result = 0; 4  5     while (x != 0) 6     { 7         int tail = x % 10; 8         int newResult = result * 10 + tail; 9         if ((newResult - tail) / 10 != result)10         { return 0; }11         result = newResult;12         x = x / 10;13     }14 15     return result;16 }

 

转载于:https://www.cnblogs.com/cuphoria/p/9588283.html

你可能感兴趣的文章
java:Java里数字转字符串前面自动补0的实现
查看>>
获取图片颜色的rgb,以供css设计背景颜色
查看>>
org.tinygroup.validate-验证框架
查看>>
人脸识别中的harr特征提取(转)
查看>>
Windows 8 Metro App开发[6]访问Assets文件夹
查看>>
Cpython的全局解释器锁(GIL)
查看>>
session共享方法
查看>>
ASP.NET AJAX web chat application
查看>>
14--Rails的ActiveView2
查看>>
UVa 496 - Simply Subsets
查看>>
java基础思维导图大全
查看>>
C# 面向对象7 命名空间
查看>>
MySQL单机上多实例安装
查看>>
java8 增强的Iterator遍历集合元素
查看>>
Codeforces Round #566 (Div. 2) B. Plus from Picture
查看>>
Linux命令(23)grep命令的使用
查看>>
蓝桥杯第五届B组 李白打酒
查看>>
shell编程基础练习
查看>>
20165330 2017-2018-2 《Java程序设计》第3周学习总结
查看>>
sql 语句整理
查看>>