题目描述:
实现 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:
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):
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;
}
解题思路2:
使用递归算法解决
python:
class Solution(object):
def myPow(self, x, n):
if n == 0: return 1
if n < 0: return 1/self.myPow(x, -n)
ans = self.myPow(x, n/2)
if n % 2 == 0:
return ans*ans
else:
return ans*ans*x
来源于: leetcode
class Solution:
def myPow(self, x, n):
def quickMul(N):
if N == 0:
return 1.0
y = quickMul(N // 2)
return y * y if N % 2 == 0 else y * y * x
return quickMul(n) if n >= 0 else 1.0 / quickMul(-n)
C++:
//递归算法
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;
}
}
};
解题思路3: 暴力方法,超出时间限制
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;
}
};
参考链接:
leetcode 50. Pow(x, n)