zoukankan      html  css  js  c++  java
  • 算法模版:非递归快速幂算法详解

     1 // 计算a^b
     2 long long quick_power(long long a, long long b) {
     3     long long result = 1;
     4     while (b) {
     5         if (b & 1) result *= a; // 判断最后一位二进制位数是否为1
     6         b >>= 1; // 右移位一位
     7         a *= a; // a在下一位的基数应该是上一位的a倍
     8     }
     9     return result;
    10 }

    算法解释:

    比如a=2, b=15

    那么正常应该是有15个2相乘

    这个优化算法中是这么做的,15 = 8 + 4 + 2 + 1

    那么简化为2^8 * 2^4 * 2 ^ 2 * 2^1

    而15转化为2进制是:1111,每一位对应一个基系数,如果为0则不作处理,如果为1则在累积结果中乘上对应基的值。

    让a作为基数,在循环中代表这次循环中如果应该计算的话应该乘多少进去,即上例中,a在每次循环中分别是2, 4, 16, 32, 即2^1 2^2 2^4 2^8。

    我们来判断b的二进制数的最后一位是不是为1来决定是否算进去这位。

  • 相关阅读:
    Kaggle & Machine Learning
    练习题目总结
    日常练习//算法类
    论文阅读
    codeforces专项
    10.26—11.1
    常见算法笔记
    DM/ML学习实践(一)
    Python常见代码
    HDU 4251 --- 主席树(划分树是正解)
  • 原文地址:https://www.cnblogs.com/laiy/p/4365226.html
Copyright © 2011-2022 走看看