数的反转
问题描述
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123
输出: 321
示例 2:输入: -123
输出: -321
示例 3:输入: 120
输出: 21
注意:假设我们的环境只能存储得下
32 位
的有符号整数,则其数值范围为 [ , ]。请根据这个假设,如果反转后整数溢出那么就返回 0。
问题分析
此处应该考虑数据溢出的可能,对于本数据若是溢出则返回0,选择适合的数据类型是一个重要问题。
代码实现
class Solution {
public:
int reverse(int x) {
if(x/10 == 0) return x; //一般个位情况,不需要反转,原样输出
int y = 0;
while(x) {
if(y > INT_MAX/10 || y < INT_MIN/10) //数据溢出
return 0;
y *= 10;
y += x%10; //取出x的个位,存入y中相应的位置
x /= 10; //去掉x的个位
}
return y;
}
};
运行结果
输入
123
输出
321
总结
本次对数的反转采用将原数逐一从末尾拆分,从首位拼接新数。数据溢出控制采用
int
类型的上下限——INT_MAX
与INT_MIN
加以控制。因为
int
占4字节32位,根据二进制编码的规则INT_MAX = -1
INT_MIN= -
C/C++中,所有超过该限值的数,都会出现溢出,出现
warning
,但是并不会出现error
。
注意:有符号(signed)数最高位为符号位,在无溢出(overflow、underflow)的情况下,其符号位不变,符号也就不变。