给定一个 32 位有符号整数,将整数中的数字进行反转。
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
注意:
假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−2^31, 2^31 − 1]。根据这个假设,如果反转后的整数溢出,则返回 0。
这道题我的思路是,先全部统一为正数,然后每次模10取余数,res*10+余数,实现反转
实现过程中出现的第一个问题是res * 10,由于res是int型,当超过int型范围时,存储异常。因此修改为(long long)res * 10
进行强制类型转换,这样就不会溢出了
出现的第二个问题,是我统一为正数的时候,负数直接*-1,观察到负数的范围实际上是可以取到-2^31的,当乘-1后,会超过int边界,无法正常做乘法运算。
思考了一下,不作统一转换了,只是在res计算的时候,余数x%10的值,当x为负数时,余数额外乘-1,如此得到的就均为正数结果了
从参考答案中了解到,原来C++中有自带的INT_MAX和INT_MIN
具体代码:
#include<ctype.h>
#include<stdio.h>
#include<cstdio>
#include<string>
#include<iostream>
using namespace std;
int reverse(int x){
int sym = 0;
long long int_max = 2147483647;
int res = 0;
if(x < 0){
sym = 1;
}
while(x){
if(int_max + sym - (x % 10) < (long long)res * 10){
return 0;
}
res *= 10;
res += sym ? (-1 * (x % 10)) :x % 10;
x /= 10;
}
if(sym){
res *= -1;
}
return res;
}
int main(){
cout << reverse(-647) << endl;
return 0;
}