快速幂算法

快速幂是一种简单而有效的小算法,它可以以 O ( l o g n ) O(logn) O(logn)的时间复杂度计算幂。

6 5 6^{5} 65为例,我们将幂转换为二进制 ( 101 ) 2 (101)_2 (101)2 6 5 = 6 ( 101 ) 2 6^{5}=6^{(101)_2} 65=6(101)2

所以我们只需看101中的每一个1都代表是多少即可。

  • 我们首先看最后一个1,表示 6 1 6^1 61;
  • 中间的0,如果这里是个1则表示 6 2 6^2 62,上一位表示数值的平方,即 ( 6 1 ) 2 (6^1)^2 (61)2
  • 第一个1,表示 6 4 6^4 64,也就是上一位表示数值的平方,即 ( 6 2 ) 2 (6^2)^2 (62)2

知道了每一位代表多少数值,然后我们将上述结果相乘即可。

现在就有2个问题摆在面前,

  1. 我们怎么区分当前位是0还是1呢?
  2. 我们怎么获取每一位的数值呢?

为了解决上述问题,对于幂101,可以使用这样一套操作:

  1. 与1进行按位与& ,即 101 & 1 = 101 & 001 = 001 101\&1=101\&001=001 101&1=101&001=001,说明最后一位是1
  2. 然后幂 右移1,即 101 > > 1 = 010 101>>1=010 101>>1=010;
  3. 按位与, 010 & 1 = 010 & 001 = 000 010 \& 1= 010 \& 001 = 000 010&1=010&001=000,说明第二位是0;
  4. 右移1, 010 > > 1 = 001 010>>1=001 010>>1=001;
  5. 按位与; 001 & 1 = 001 & 001 = 001 001 \& 1= 001 \& 001 = 001 001&1=001&001=001,说明第一位是1;

至此全部问题都解决了,代码如下:

def fastPower(base, n):
    # &按位与运算,举例101&011= 001,就是在二进制下,都是1才是1
    ans = 1

    while n:
        if n & 1:
            ans *= base
        base *= base  # 平方
        n >>= 1

    return ans
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

little student

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

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

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

打赏作者

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

抵扣说明:

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

余额充值