劍指offer題解C++【12】數值的整數次冪
阿新 • • 發佈:2019-02-12
題目描述
給定一個double型別的浮點數base和int型別的整數exponent。求base的exponent次方。
解題思路
庫函式中有冪函式pow(x,y),如果你直接return pow(base,exponent);也能通過測試用例,但估計offer無緣了。
為了降低時間複雜度,使用迭代:
- 如果n為偶數,a^n=a^(n/2)*a(n/2);
- 如果n為奇數,a^n=a^(n/2)*a(n/2)*a;
- n/2可以用右移1位得到;
此外,本題還要考慮以下幾點:
- exponent=0時,結果為1;
- base趨近於0時,結果為0;
- base趨近於1時,結果為1;
- base趨近於-1時,指數為奇數時結果為-1,指數為偶數時結果為1;
- exponent<0時,結果為(1/base)^(-exponent);
程式碼
class Solution {
public:
double Power(double base, int exponent) {
if (exponent == 0)
return 1.0;
if (fabs(base) < 1e-5)
return 0.0;
if (fabs(base - 1) < 1e-5)
return 1;
if (fabs(base + 1) < 1e-5)
return exponent % 2 ? -1 : 1;
if (exponent < 0){
base = 1.0 / base;
exponent = -exponent;
}
double res = 1.0;
while (exponent){
if (exponent % 2){
res *= base;
}
base *= base;
exponent >>= 1;
}
return res;
}
};