@ Python实现快速幂

前几天,在刷剑指offer的时候,看到了这一类型的题目,看了好多文章,在这里做一下下笔记,以便日后复习。

思路

传统的幂运算,是对底数进行连乘,时间复杂度为o(n),例如:2^13 = 222……*2,连乘十三次。
利用指数的二进制,可以实现复杂度为o(logn)的幂运算。还是以2^13为例,13的二进制为1101,因此2的13次方可以分解成以下形式:
在这里插入图片描述
和13的二进制1101相对比,只要二进制为1的位,就有权重,权重为2^(i-1),i表示第几位,1101从右到左,依次为第1位,第2位,第3位,第4位。
下面的工作就是如何确定二进制中的哪一位为1,这里可以利用位运算中的&和>>运算。由于1的二进制除了第一位是1,其他的全是0,因此可以利用n&1是否为0来判断n的二进制的当前最低位是否为1,如果n&1等于0,说明当前n的最低位不为1。利用右移运算来逐位读取。
快速幂的代码如下:

代码(这里就不考虑指数为小于0的情况了)

def power(base,exponent):
    res = 1
    while exponent:
        if exponent & 1:  # 判断当前的最后一位是否为1,如果为1的话,就需要把之前的幂乘到结果中。
            res *= base
        base *= base  # 一直累乘,如果最后一位不是1的话,就不用了把这个值乘到结果中,但是还是要乘。
        exponent = exponent >> 1
    return res

注意base*base

不断的让base*=base目的是累乘,以便当exponent最后一位为1时,随时对res做出贡献。
base–>base2–>base4–>base8–>base16–>base32…指数正是 没循环一次,res乘的就是
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/ggdhs/article/details/90141960
今日推荐