剣はオファー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;
}
}