竞赛算法必修——二分快速幂

在刷力扣的时候遇到了一个计算指数幂的题,我直接想到了使用<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));
    }
};

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

郁达夫不会编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值