一、题目描述:50. Pow(x, n)(中等)
实现 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] 。来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/powx-n
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、解题思路
方法一、使用递归,当n为奇数递归获取p = P(x,n/2),返回p*p*x,当n为偶数递归会话p = P(x,n/2),返回p*p
方法二、不使用递归,初始化ans = x,n =n/2,当n%2 == 1(为奇数)则ans *= ans*x,当n%2==0,则ans*=ans直到n==0
三、代码
class Solution {
public:
double myPow(double x, int n) {
if(x == 0)
return 0;
if(n == 0 || x == 1)
return 1;
map<int,double> save;
bool is_min = false;
if(n == INT_MIN)
{
n = n+1;
is_min = true;
}
bool fu = (n < 0)?true:false;
n = (n<0)?-1*n:n;
double result = myPow(x,n,save);
if(is_min == true)
result *= x;
if(fu == false)
return result;
else
return 1/result;
}
double myPow(double &x, int n,map<int,double> & save)
{
if(n == 1)
return x;
if(save.count(n) > 0)
return save[n];
int mod = n%2;
int divisor = n/2;
double ret = myPow(x,divisor,save);
double tmp = (mod==0)?1:x;
double result = ret * ret*tmp;
save[n] = result;
return result;
}
};