您的位置:首页 > 编程语言 > C语言/C++

leetcode 7 整数反转 c++

2020-01-14 09:41 155 查看

7整数反转

题目链接:https://leetcode-cn.com/problems/reverse-integer/submissions/

这个题也是一个输出控制,本身不难,难在对特殊测试样例的处理。题目要求反转后溢出的数(在$ [−2^{31}, 2^{31} − 1]范围以外),输出结果要是0,这就挺烦的了。我是先把负数输入变成正的,再取余移位,但这里就有个问题,负数是可以输入范围以外),输出结果要是0,这就挺烦的了。我是先把负数输入变成正的,再取余移位,但这里就有个问题,负数是可以输入范围以外),输出结果要是0,这就挺烦的了。我是先把负数输入变成正的,再取余移位,但这里就有个问题,负数是可以输入-2^{31}$的,但是变成正数2312^{31}231就溢出了,所以先要处理这个特殊的数。然后就是反转溢出的判定,这里我原来写的是:

if((result*10+signal*(tem%10))>(pow(2,31)-1)||(result*10+signal*(tem%10))<(-pow(2,31))){

也就是先乘起来再和边界比较,结果发现

(result*10+signal*(tem%10)
是会溢出的,就改成了

if(result>((pow(2,31)-1-signal*(tem%10))/10)||result<((-pow(2,31)-signal*(tem%10))/10)){

这样子

(pow(2,31)-1-signal*(tem%10)
是绝不会溢出的,原因就在于pow返回的类型是double,这范围就大了([−1.7∗10308,−1.7∗10−308]⋃[1.7∗10−308,1.7∗10308][-1.7*10^{308},-1.7*10^{-308}]\bigcup[1.7*10^{-308},1.7*10^{308}][−1.7∗10308,−1.7∗10−308]⋃[1.7∗10−308,1.7∗10308],这样子就不会溢出了。

class Solution {
public:
int reverse(int x) {
int result=0;
int signal=1;
int tem=x;
if (x<0){
signal=-1;
if(x==-pow(2,31)){
tem=0;
}
else{
tem=-x;
}
}
while(tem!=0){
if(result>((pow(2,31)-1-signal*(tem%10))/10)||result<((-pow(2,31)-signal*(tem%10))/10)){result=0;
break;
}
result=result*10+signal*(tem%10);
tem=(int)(tem/10);
}
return result;
}
};
  • 点赞
  • 收藏
  • 分享
  • 文章举报
cccler 发布了20 篇原创文章 · 获赞 0 · 访问量 660 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: