剣はオファー16を指します。値の整数乗

剣はオファー16を指します。値の整数乗

タイトル説明

ここに画像の説明を挿入

問題解決のアイデア

この質問の難しさは、さまざまな境界条件を考慮することです。
ここに画像の説明を挿入


高速パワーの指数が長いタイプを使用するのはなぜですか?

intの範囲は[-2 ^ 31,2 ^ 31-1]であるため、負の数の範囲は正の数の範囲よりも大きく、単純に絶対値を取ることはできません。底が正確に-2 ^ 31で、指数がint型の場合、オーバーフローします。


double型の変数が等しいかどうかを比較するには、「==」を使用しないでください。equalsメソッドを使用して文字列に変換するか、2つのdouble変数の差を1つのエラー(1e-6など)だけ減らします。


class Solution {
    
    
    public double myPow(double x, int n) {
    
    
        long N = n;
        //底数为0,指数小于0,则非法
        if (isEqual(x, 0.0) && N < 0) return 0.0;
        //底数为0,指数大于等于0,直接返回0.0
        if (isEqual(x, 0.0) && N >= 0) return 0.0;
        
        return N >= 0 ? quickPow(x, N) : 1.0 / quickPow(x, -N);
        
    }

    //快速幂模板, 注意指数 exponent 是 long 类型防止溢出,且为非负数
    public double quickPow(double base, long exponent) {
    
    
        if (exponent == 0) return 1;
        if (exponent == 1) return base;

        double res = quickPow(base, exponent >> 1);
        res *= res;
        //如果是奇数,则要额外乘上base
        if ((exponent & 0x01) == 1)
            res *= base;
        return res;
    }

    //判断两个 double 变量是否相等
    public boolean isEqual(double a, double b) {
    
    
        return Math.abs(a - b) < 1e-6;
    }
}

おすすめ

転載: blog.csdn.net/cys975900334/article/details/114837868
おすすめ