1.題目描述
實現函數double Power(double base, int exponent),求base的exponent次方。不得使用庫函數,同時不需要考慮大數問題。
示例 1:
輸入: 2.00000, 10
輸出: 1024.00000
示例 2:
輸入: 2.10000, 3
輸出: 9.26100
示例 3:
輸入: 2.00000, -2
輸出: 0.25000
解釋: 2-2 = 1/22 = 1/4 = 0.25
說明:
-100.0 < x < 100.0
n 是 32 位有符號整數,其數值範圍是 [−231, 231 − 1] 。
2.問題分析
思路描述:因爲不用考慮大數問題,所以只需要循環地去計算就可以了,但是單純的循環去算,比如:
for(int i = 1; i < n; i ++)
x *= x;
是會超時的。
所以這裏使用快速冪的方法,那麼什麼是快速冪呢我們看一個例子:
我們要求29
我們知道
9
的二進制是1001
,也就是1 * 20+0 * 21+0 * 22+1 * 23
那麼29 =21 * 20 * 20 * 21*20 * 22*21 * 23
我們發現,每次指數乘的值都是前一個值的2倍,當 n 對應位爲0時跳過
3.代碼實現:
3.1C++代碼
class Solution {
public:
double myPow(double x, int n) {
if(x == 1 || n == 0) return 1;
double ans = 1;
long num = n;
if(n < 0){
num = -num;
x = 1/x;
}
while(num){
if(num & 1)
ans *= x;
x *= x;
num >>= 1;
}
return ans;
}
};
1.
(num&1)
是判斷指數的二進制此位是否爲1
2.x=x*x
:每一次判斷一次二進制數就往後移動一位然後x就變爲原來的平方
3.2Java代碼
class Solution {
public double myPow(double x, int n) {
if(x == 1 || n == 0) return 1;
double ans = 1;
long num = n;
if(n < 0){
num = -num;
x = 1/x;
}
while(num>0){
if((num&1)==1)
ans *= x;
x *= x;
num >>= 1;
}
return ans;
}
}