力扣7:关于不使用long如何判断int越界问题

        

 

这道题进行整数反转,只能个体思路比较简单,代码如下:

int类型的范围:-2,147,483,648~2,147,483,647

不过关于如何在不使用long类型的前提下判断是否越界。证明过程如下:

        前提:反转整数的整体思路是,维护一个rev作为反转后的整数,不断取出x的最后一位加到rev的最后一位上。所以判断是否越界就可以在rev上进行判断。

        对于rev,我们要保证它在加入digit后保持在INT_MAX和INT_MIN之间。

        即                            INT_MIN<rev*10+digit<INT_MAX

        1. 先就等式的右半边rev*10+digit<INT_MAX做变换:

        在这里我们INT_MAX做一下变换,将其变为floor(INT_MAX/10)*10+7。因为在正数中2^32-1的的末尾数字为7。                           

        此时这个式子变为:rev*10+digit<floor(INT_MAX/10)*10+7。 将乘10的部分放到左边,我们可以看到(rev-floor(INT_MAX/10))*10<7-digit。

        此时存在三种情况:

         rev-floor(INT_MAX/10)>0:此时该等式肯定无法成立

         rev-floor(INT_MAX/10)=0:此时当digit<7时该式子可以成立。但是我们可以看到的是,INT_MAX的第一位是2,也就意味着,当要越界时,digit的值肯定小于2 .所以这种情况该等式恒成立。

关于说为什么是要越界时,因为x的最高位是最后取出的,而如果说存在越界情况的话,说明整数x的位数肯定是10位的。当越界时取出的digit肯定是最高位,即1或者2

        rev-floor(INT_MAX/10)<0:此时恒成立。

        所以,当rev-floor(INT_MAX/10)<=0时,可以判断次数不会越界。

        2. 先就等式的右半边rev*10+digit>INT_MIN做变换,此时的论证过程同理:

        在这里我们INT_MIN做一下变换,将其变为floor(INT_MIN/10)*10-8。因为在负数中-2^32-1的的末尾数字为8。                           

        此时这个式子变为:rev*10+digit>floor(INT_MIN/10)*10-8将乘10的部分放到左边,我们可以看到(rev-floor(INT_MIN/10))*10>-digit-8。

        此时存在三种情况:

         rev-floor(INT_MIN/10)>0:  此时该等式恒成立。

         rev-floor(INT_MIN/10)=0:此时该等式恒成立

        rev-floor(INT_MIN/10)<0: 此时该等式恒不成立。

        所以,当rev-floor(INT_Min/10)>=0时,可以判断次数不会越界。   

   综上所示,当rev-floor(INT_Min/10)>=0或rev-floor(INT_MAX/10)<=0时,该数不会越界。

                                               

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程思睿Siri

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值