整数的反向数字:如何确定数字是否溢出?

时间:2019-01-10 12:32:01

标签: java integer

我正在尝试解决问题:

  

给出一个32位带符号整数(整数的倒数),当反向整数溢出时返回0。

我的解决方法是:

public int reverse(int x)
{
    int reversedNumber = 0;
    boolean isNumberNegative = x < 0;
    x = Math.abs(x);
    while (x >= 10)
    {
        reversedNumber = reversedNumber * 10 + (x % 10);
        x = x / 10;
    }
    reversedNumber = reversedNumber * 10 + x;
    return isNumberNegative ? -1 * reversedNumber : reversedNumber;
}

我的问题是溢出,如何在不使用reversedNumber实用程序类或Math的情况下检查long是否溢出?

2 个答案:

答案 0 :(得分:1)

您可以利用intlong的转换,反之亦然,因为long大于Integer.MAX_VALUE但小于Integer.MIN_VALUE会溢出当投射回int时,可以在最后两行中看到:

public int reverse(int x) {
    long reversedNumber = 0;
    boolean isNumberNegative = x < 0;
    x = isNumberNegative ? -x : x;
    while (x >= 10) {
        reversedNumber = reversedNumber * 10 + (x % 10);
        x = x / 10;
    }
    reversedNumber = reversedNumber * 10 + x;
    reversedNumber = isNumberNegative ? -reversedNumber : reversedNumber;

    int result = (int) reversedNumber ;
    return reversedNumber != result ? 0 : result;
}

答案 1 :(得分:0)

您可以尝试这样做,而无需任何强制转换:

public int reverse(int x) {
    int reversedNumber = 0;
    int digitCount = 1;
    x = Math.abs(x);
    while (x >= 10) {
        if(digitCount >= 9 && willOverflow(reversedNumber)){
            return 0;
        }
        reversedNumber = reversedNumber * 10 + (x % 10);
        x = x / 10;
        digitCount++;
    }
    if(willOverflow(reversedNumber)){
        return 0;
    }
    reversedNumber = reversedNumber * 10 + x;
    if(reversedNumber < 0){
        return 0;
    }

    return reversedNumber;
}

private boolean willOverflow(int reversedNumber) {
    int tmpMultiply = reversedNumber * 10;
    int tmpDivide = tmpMultiply / 10;
    return tmpDivide != reversedNumber;
}

如果我相信您可以通过将整数乘以10然后除以10来检查整数是否会溢出,则如果末尾的值与传递的值不同,则可以假定整数将在下一次迭代中溢出(如果有)下一个迭代)。