검은 제공 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;
}
}