7整数反转
题目链接:https://leetcode-cn.com/problems/reverse-integer/submissions/
这个题也是一个输出控制,本身不难,难在对特殊测试样例的处理。题目要求反转后溢出的数(在$ [−2^{31}, 2^{31} − 1] 范 围 以 外 ) , 输 出 结 果 要 是 0 , 这 就 挺 烦 的 了 。 我 是 先 把 负 数 输 入 变 成 正 的 , 再 取 余 移 位 , 但 这 里 就 有 个 问 题 , 负 数 是 可 以 输 入 范围以外),输出结果要是0,这就挺烦的了。我是先把负数输入变成正的,再取余移位,但这里就有个问题,负数是可以输入 范围以外),输出结果要是0,这就挺烦的了。我是先把负数输入变成正的,再取余移位,但这里就有个问题,负数是可以输入-2^{31}$的,但是变成正数 2 31 2^{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
∗
1
0
308
,
−
1.7
∗
1
0
−
308
]
⋃
[
1.7
∗
1
0
−
308
,
1.7
∗
1
0
308
]
[-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;
}
};