Math Power(x,n)不工作-2147483648 for in java?[副本]

oug3syen  于 2023-05-12  发布在  Java
关注(0)|答案(1)|浏览(282)

此问题已在此处有答案

Math.abs returns wrong value for Integer.Min_VALUE(8个回答)
20小时前关闭。
我在做一个leetcode问题。https://leetcode.com/problems/powx-n/
实现pow(x,n),计算x的n次幂(即x^n)。
我不知道为什么最后一个测试用例失败了,x^-2147483648返回1而不是0。
1.为什么它会在第一位返回0?
1.此外,调试器中的Math.abs(n)仍然返回负-2147483648。

验证码:

class Solution {
    public double myPow(double x, int n) {
        if (n == 0)
            return 1;
        if (n < 0) {
            return 1 / getDFS(x, Math.abs(n));
        }
        return getDFS(x, n);
    }

    private double getDFS(double x, int n) {
        if (n == 1) {
            return x;
        }
        double saveData = 1;
        if (n / 2 >= 1) {
            int newN = n / 2;
            saveData = getDFS(x,newN);
        } 
        if (n % 2 == 1) {
            return saveData * saveData * x;
        }
        return saveData * saveData;
    }
}

结果:

vecaoik1

vecaoik11#

最小负int值的大小大于最大正int值的大小。因此,Math.abs无法返回Integer.MIN_VALUE的正确值。
要解决这个问题,您可以在使用二进制取幂之前将指数转换为long

public double myPow(double x, int n) {
    if (n == 0)
        return 1;
    if (n < 0) return 1 / getDFS(x, Math.abs((long) n));
    return getDFS(x, n);
}
private double getDFS(double x, long n) {
    // ...
    if (n / 2 >= 1) { 
        long newN = n / 2;
        saveData = getDFS(x,newN);
    }
    // ...
}

相关问题