Given a 32-bit signed integer, reverse digits of an integer.
Example 1:
Input: 123 Output: 321
Example 2:
Input: -123 Output: -321
Example 3:
Input: 120 Output: 21
Note:
Assume we are dealing with an environment which could only store integers within the 32-bit signed integer range: [−231, 231 − 1]. For the purpose of this problem, assume that your function returns 0 when the reversed integer overflows.
问题重述:
给出一个int型的数据,进行翻转,如果是123就翻转成321,如果是120就翻转成21。同样的,负数也要进行翻转,-120就翻转成-21。
需要注意的问题在于有符号型的int是32位,那么数字的范围是 -2^31到2^31-1的范围。比如11 2345 6789,这个不超过范围,但是翻转过来就一定溢出了。
解决方案:
在定义类型的时候使用long long int型,防止溢出,之后在与2^31进行比较,如果溢出就返回0,不溢出就正常返回即可。
#include<vector>
#include <iostream>
#include <string.h>
#include <cmath>
using namespace std;
class Solution {
public:
long long int reverse(long long int x)
{
if (x == 0)
return 0;
while (1)
{
if (x % 10 == 0)
x = x / 10;
else
break;
}
long long int m = 0;
long long int temp;
while (x != 0)
{
temp = x % 10;
m = m * 10 + temp;
x = x / 10;
}
if (abs(m) >= pow(2, 31))
return 0;
else
return m;
}
};
// 1534236469 反向就会发生溢出
// 有符号型,32位的int就相当于 -2^31 至 2^31-1(因为这边包括了0)
// 使用long long int 2^64型,即便溢出也可以在这里进行判断。
int main()
{
long long int n;
cin >> n;
// cout << n << endl;
long long int m;
Solution so;
m = so.reverse(n);
cout << m << endl;
system("pause");
return 0;
}