反向整数Catch溢出C ++

时间:2016-09-13 19:36:22

标签: c++ c++11 integer-overflow

您好我在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,有没有更简单的方法做同样的事情?

4 个答案:

答案 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;
    }