您好我在c ++中尝试一个简单的反向整数运算。代码如下:
#include <iostream>
#include <algorithm>
#include <climits>
using namespace std;
class RevInteger {
public:
int reverse(int x)
{
int result = 0;
bool isNeg = x > 0 ? false : true;
x = abs(x);
while (x != 0)
{
result = result * 10 + x % 10;
x = x / 10;
}
if (isNeg)
result *= -1;
if (result > INT_MAX || result < INT_MIN)
return 0;
else
return (int)result;
}
};
当我给它输入1534236469;我希望它返回0,而不是它返回一些垃圾值。我的计划有什么问题。此外,我正在尝试使用climbits lib,有没有更简单的方法做同样的事情?
答案 0 :(得分:1)
最简单的方法是使用long long
代替int
作为结果,并检查最后的溢出:
long long result = 0;
/* the rest of your code */
return (int)result; // Now the cast is necessary; in your code you could do without it
另一种方法是将int
转换为字符串,将其反转,然后使用标准库尝试将其转换回来,并在此过程中捕获问题(demo):
int rev(int n) {
auto s = to_string(n);
reverse(s.begin(), s.end());
try {
return stoi(s);
} catch (...) {
return 0;
}
}
如果你必须保持整数,那么一种方法是在将中间结果乘以10之前检查中间结果,并在加法后检查溢出:
while (x != 0) {
if (result > INT_MAX/10) {
return 0;
}
result = result * 10 + x % 10;
if (result < 0) {
return 0;
}
x = x / 10;
}
答案 1 :(得分:0)
正如@daskblinkenlight所建议的那样;将结果更改为long long并在最后进行类型转换可以解决问题。
工人阶级:
class intReverse {
public:
int reverse(int x) {
long long result = 0; // only change here
bool isNeg = x > 0 ? false : true;
x = abs(x);
while (x != 0) {
result = result * 10 + x % 10;
x = x / 10;
}
if (isNeg) {
result *= -1;
}
if (result > INT_MAX || result < INT_MIN)
{
return 0;
}
else
{
return (int) result;
}
}
};
答案 2 :(得分:0)
class Solution {
public:
int reverse(int x) {
int reversed = 0;
while (x != 0) {
if (reversed > INT_MAX / 10 || reversed < INT_MIN / 10) return 0;
reversed = reversed * 10 + (x % 10);
x /= 10;
}
return reversed;
}
};
如果反转大于8位INT_MAX(INT_MAX / 10),那么如果我们将1位反转,我们将有一个int溢出。和INT_MIN类似。
答案 3 :(得分:0)
int reverse(int x) {
int pop = 0;
int ans = 0;
while(x) {
// pop
pop = x % 10;
x /= 10;
// check overflow
if(ans > INT_MAX/10 || ans == INT_MAX/10 && pop > 7) return 0;
if(ans < INT_MIN/10 || ans == INT_MIN/10 && pop < -8) return 0;
// push
ans = ans * 10 + pop;
}
return ans;
}