1.题目描述
实现 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] 。
2. 思路
1.暴力法:暴力递归,累乘,o(n)
2. 采用二分查找+递归的思想,简化计算复杂度 o(logn)
利用二分查找:
将幂次n/2;计算A = pow(x,n/2)的结果:
若n为偶数,返回 A*A;
若n为奇数,返回A*A*x;
最后再用递归调用完成,递归的边界条件是 n=0,return 1.0;
还有一个注意是:
1.当n为复数时,将转换为正数后再计算并且将 x装换为 1/x;
3.代码实现
class Solution {
public:
double myPow(double x, int n) {
/*
思路: 参考昨天的做法,将计算 平方的平方的平方。。。
1.特殊情况考虑 n<0,用1/n计算;
*/
long long N = n;
if(N<0)
{ x = 1/x;
N = -N;
}
return fastpow(x,N);
}
double fastpow(double a, long long b)
{
if(b == 0) return 1.0;
double half = fastpow(a,b/2);
if(b % 2 == 0) return half*half;
else return half*half*a;
}
};
4.参考
leetcode 题解:https://leetcode-cn.com/problems/powx-n/solution/powx-n-by-leetcode/
5.待补充:
位运算的解法
来源:CSDN
作者:liuzengyuan10
链接:https://blog.csdn.net/Quentinmen/article/details/104799861