算法数据结构奇技淫巧2、m的n次方

2019-06-1010:17:32数据结构与算法Comments2,018 views字数 437阅读模式

2、m的n次方

如果让你求解 2 的 n 次方,并且不能使用系统自带的 pow 函数,你会怎么做呢?这还不简单,连续让 n 个 m 相乘就行了,代码如下:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/13538.html

int pow(int n){
    int tmp = 1;
    for(int i = 1; i <= n; i++) {
        tmp = tmp * m;
    }
    return tmp;
}

不过你要是这样做的话,我只能呵呵,时间复杂度为 O(n) 了,怕是小学生都会!如果让你用位运算来做,你会怎么做呢?文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/13538.html

我举个例子吧,例如 n = 13,则 n 的二进制表示为 1101, 那么 m 的 13 次方可以拆解为:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/13538.html

m^1101 = m^0001 * m^0100 * m^1000。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/13538.html

我们可以通过 & 1和 >>1 来逐位读取 1101,为1时将该位代表的乘数累乘到最终结果。直接看代码吧,反而容易理解:文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/13538.html

int pow(int n){
    int sum = 1;
    int tmp = m;
    while(n != 0){
        if(n & 1 == 1){
            sum *= tmp;
        }
        tmp *= tmp;
        n = n >> 1;
    }

    return sum;
}

时间复杂度近为 O(logn),而且看起来很牛逼。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/13538.html

作者:帅地
来源:知乎文章源自菜鸟学院-https://www.cainiaoxueyuan.com/suanfa/13538.html

  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/suanfa/13538.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定