反向整数捕获溢出 C++
Reverse Integer Catch overflow C++
您好,我正在尝试用 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 时;我希望它 return me 0,而不是 return 给我一些垃圾值。我的程序有什么问题。另外,我正在尝试使用 climits 库,有没有更简单的方法来做同样的事情?
最简单的方法是使用 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;
}
根据@daskblinkenlight 的建议;将结果更改为 long long 并在最后进行类型转换可以解决问题。
工作class:
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;
}
}
};
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;
}
};
如果reversed大于8位数字INT_MAX (INT_MAX / 10),那么如果我们在reversed的基础上加1位数字,就会出现int溢出。类似于 INT_MIN.
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;
}
您好,我正在尝试用 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 时;我希望它 return me 0,而不是 return 给我一些垃圾值。我的程序有什么问题。另外,我正在尝试使用 climits 库,有没有更简单的方法来做同样的事情?
最简单的方法是使用 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;
}
根据@daskblinkenlight 的建议;将结果更改为 long long 并在最后进行类型转换可以解决问题。
工作class:
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;
}
}
};
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;
}
};
如果reversed大于8位数字INT_MAX (INT_MAX / 10),那么如果我们在reversed的基础上加1位数字,就会出现int溢出。类似于 INT_MIN.
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;
}