zoukankan      html  css  js  c++  java
  • 学习笔记:快速幂

    【定义】快速幂顾名思义,就是快速算某个数的多少次幂。其时间复杂度为 O(log₂N), 与朴素的O(N)相比效率有了极大的提高。

    【举例】
    以下以求a的b次方来介绍
    把b转换成二进制数。
    该二进制数第i位的权为2^(i-1)
    例如a^11=a^(2^0+2^1+2^3)
    11的二进制是1011
    11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1
    因此,我们将a¹¹转化为算a^(2^0)*a^(2^1)*a^(2^3)
    【实现】
    快速幂可以用位运算这个强大的工具实现
    b&1 {也就是取b的二进制最低位(即第0位) 判断b是否为奇数,是则为1}
    b>>1{就是去掉b的二进制最低位(即第0位)}
    【代码】
    1、常规求幂
    1 int pow1(inta,intb)
    2 {
    3     int r=1;
    4     while(b--)
    5         r*=a;
    6     return r;
    7 } 
    常规求幂

    2、二分求幂(一般)

     1 int pow2(inta,intb)
     2 {
     3 int r=1,base=a;
     4 while(b!=0)
     5 {
     6     if(b%2)
     7         r*=base;
     8     base*=base;
     9     b/=2;
    10 }
    11 return r;
    12 }
    二分求幂(一般)

    3、二分求幂(位操作)

     1 int pow3(int a,int b)
     2 {
     3     int r=1,base=a;
     4     while(b!=0)
     5     {
     6         if(b&1)
     7             r*=base;
     8         base*=base;
     9         b>>=1;
    10     }
    11     return r;
    12 }
    二分求幂(位操作)

    4、快速幂(位运算)

     1 int pow4(int x,int n)
     2 {
     3     if(n==0) return 1;
     4     else
     5     {
     6         while((n&1)==0)
     7         {
     8             n>>=1;
     9             x*=x;
    10         }
    11     }
    12     int result=x;
    13     n>>=1;
    14     while(n!=0)
    15     {
    16         x*=x;
    17     if((n&1)!=0)
    18         result*=x;
    19     n>>=1;
    20     }
    21     return result;
    22 }
    快速幂(位运算)
  • 相关阅读:
    从零开始webpack4.x(五) js处理
    从零开始webpack4.x(四)样式loader
    从零开始webpack4.x(三)html插件
    从零开始webpack4.x(二)基础
    从零开始webpack4.x(一)介绍
    【转】react和vue渲染流程对比
    css3相关
    html5相关
    this指向
    整数划分问题(递归)
  • 原文地址:https://www.cnblogs.com/SBSOI/p/5640700.html
Copyright © 2011-2022 走看看