題目描述:
實現 pow(x, n) ,即計算 x 的 n 次冪函數。
示例 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] 。
題目鏈接:https://leetcode-cn.com/problems/powx-n
解題思路:
1、採用快速冪的做法,如果 n 是偶數,則 Pow(x, n) = Pow(x, n/2) * Pow(x, n/2)
如果 n是奇數,則 Pow(x, n) = Pow(x, n-1) * x
2、需要注意一些特殊情況,當 n<0, n=0, n=1
的情況需要提前處理
代碼1:
class Solution(object):
def myPow(self, x, n):
"""
:type x: float
:type n: int
:rtype: float
"""
if n < 0:
x = 1.0/x
n *= -1
elif n == 0:
return 1
elif n == 1:
return x
if ( n % 2 == 0):
half = self.myPow(x, n/2)
return half * half
else:
return (self.myPow(x, n-1)) * x
測試代碼示例:
s = Solution()
x = 2.00000
y = -2
print(s.myPow(x,y))
代碼2:
#include<iostream>
using namespace std;
double myPow(double x, long n) {
if(n<0){
x = 1.0/x;
n *= -1;
}else if(n==0){
return 1;
}else if(n==1){
return x;
}
if(n%2==0){
double half = myPow(x, n/2);
return half*half;
}else{
return myPow(x, n-1) * x;
}
}
int main()
{
double x;
long y;
x = 2.00000;
y = -2;
cout << myPow(2.00000,-2) << endl;
return 0;
}
//暴力方法,超出時間限制
class Solution {
public:
double myPow(double x, int n) {
int sign = (n > 0)?1:-1;
double ans = 1;
n = abs(n);
while(n-- > 0)
ans *= x;
return (sign == 1)?ans:1/ans;
}
};
//遞歸算法
class Solution {
public:
double myPow(double x, long n) {
if(n == 0) return 1;
if(n < 0) return 1/myPow(x,-n);
double ans = myPow(x,n/2);
if(n % 2 == 0)
{
return ans*ans;
}
else{
return ans*ans*x;
}
}
};
參考鏈接:
leetcode 50. Pow(x, n)