在刷力扣的时候遇到了一个计算指数幂的题,我直接想到了使用<cmath>里的pow()函数直接解决了,但是题目却给的是一个中等难度,然后我就去查资料然后知道了pow();这个函数的底层计算逻辑——二分快速幂。
题目:
思路:
举个例子2的10次幂我们可以看作是两个2的5次幂相乘,2的5次幂是两个2的平方和2相乘得到的,
2的平方就是2乘2。这样我们只进行3次递归运算而不是进行10次for循环进行相乘。
代码实现
在算法实现的过程中要考虑指数的奇偶:
double pow(double x , long long ans)
{
if(ans == 0) return 1.0;
double t = pow(x,ans/2);
return ans % 2 == 0 ? t * t : t * t * x;
}
还要考虑所给的指数的正负性:
double myPow(double x, int n) {
long long ans = n;
return ans>=0 ? pow(x,ans):1.0/pow(x,abs(ans));
}
完整代码
class Solution {
double pow(double x , long long ans)
{
if(ans == 0) return 1.0;
double t = pow(x,ans/2);
return ans % 2 == 0 ? t * t : t * t * x;
}
public:
double myPow(double x, int n) {
long long ans = n;
return ans>=0 ? pow(x,ans):1.0/pow(x,abs(ans));
}
};