問題描述:
實現 pow(x, n) ,即計算 x 的 n 次冪函數。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/powx-n
示例 1:
輸入: 2.00000, 10
輸出: 1024.00000
示例 2:
輸入: 2.00000, 10
輸出: 1024.00000
示例 3:
輸入: 2.00000, -2
輸出: 0.25000
解釋: 2-2 = 1/22 = 1/4 = 0.25
解題思路:
按照我們常規思路,會超時
class Solution {
public:
double myPow(double x, int n) {
if(x==0) return 0;
if(n==0) return 1;
int flag;
if(n>0) flag=1;
else flag=-1;
n = abs(n);
double res = 1;
for(int i=1;i<=n;i++){
res = res*x;
}
if(flag==1){
return res;
}else{
return 1/res;
}
}
};
這種情況會超時,所以我們考慮一下二分法
使用折半計算,每次把n縮小一半,這樣n最終會縮小到0,任何數的0次方都爲1,這時候我們再往回乘,如果此時n是偶數,直接把上次遞歸得到的值算個平方返回即可,如果是奇數,則還需要乘上個x的值
例如pow(2,7),res=1.0,初始x=2,n=7
step1 n=7 (n%2==1 res*=x) x=x*x x=4 n=n/2
step2 n=3 (n%2==1 res*=x) x=x*x x=16 n=n/2
step3 n=1 (n%2==1 res*=x) x=x*x x=256 n=n/2
n = 2*4*16=2^7;
pow(2,4),res=1.0,初始x=2,n=4
step1 n=4 n%2==0 x=x*x x=4 n=n/2
step2 n=2 n%2==0 x=x*x x=16 n=n/2
step3 n=1 (n%2==1 res*=x) x=x*x x=256 n=n/2
n = 1*16 = 2^4
class Solution {
public:
double myPow(double x, int n) {
if(x==0) return 0;
if(n==0) return 1;
double res = 1.0;
int flag = -1;
if(n>0) flag = 1;
while(n!=0){
if(n%2!=0){
res*=x;
}
x*=x;
n=n/2;
}
return flag>0?res:1/res;
}
};