검은 제공 16을 의미합니다. 값의 정수 거듭 제곱

검은 제공 16을 의미합니다. 값의 정수 거듭 제곱

제목 설명

여기에 사진 설명 삽입

문제 해결 아이디어

이 질문의 어려움은 다양한 경계 조건을 고려하는 것입니다.
여기에 사진 설명 삽입


빠른 거듭 제곱의 지수가 long 유형을 사용하는 이유는 무엇입니까?

int의 범위가 [-2 ^ 31,2 ^ 31-1]이기 때문에 음수의 범위가 양수의 범위보다 크기 때문에 단순히 절대 값을 취할 수 없습니다. 밑이 정확히 -2 ^ 31이고 지수가 int 유형이면 오버플로됩니다.


double 유형의 변수가 같은지 비교하려면 "=="를 사용하지 마십시오. equals 메소드를 사용하여 문자열로 변환하거나 여기에서와 같이 두 개의 double 변수 간의 차이를 하나의 오류 (예 : 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