快速幂

快速幂是个好东西 ,有时候一些题目需要求高次幂(例如:2^100)的运算或者大量的递归运算(斐波那契数列) 
就基本和下面两个死敌说拜拜了 
Time limit exceeded←死敌 
Memory Limit Exceeded←死敌(还有WA) 
切入正题 
——-——-——-——-——-——-——-——-——-——-——-——-——-——-——-——-——

首先我们先看看快速幂的优势在哪?

例:2^254 
常规运算需要将2连乘254次(2 * 2 …* 2 * 2) 
而254二进制表示为11111110(254=0 * 2^0 + 1 * 2^1 + 1*2^2 …+ 1 * 2^8 ) 
所以2^254=2^(0 * 2^0 + 1 * 2^1 + 1*2^2 …+ 1 * 2^8)=2^(2^1) * 2^(2^2)… * 2^(2^8) 
此时运算只用进行7次

但是如何将十进制的幂次转换为二进制呢? 
那我们就需要运用到位运算中的: 
1.& 按位与运算符 
2.>>右移运算符 
1.按位与运算符 
我们就简单的运用一下来判断末位是否为1,例如11111111&1=1,11111110&1=0 
而原因就是使位数为0的项给剔除掉 如例子中的2^254 是为了减少了首项0*2^0这一项的运算 
2.右移运算符 
刚刚通过按位与运算符判断了末位是否为1,但事实上我们要将所有数都进行判断,那么就要运用到右移运算符。例如11111110>>1则为01111111,11111110>>2则为00111111,高位补0,低位去除。所以我们就用到>>1来达到移位进行判断。

代码如下 
a为基数,b为次幂数

int FastPower(int a,int b){
    int ans=1,vis=a;
    while(b!=0)
    {
        if(b&1==1)
          ans=ans*vis;
        vis=vis*vis;//无论当前位是否为1,都需要进行,为后续进行储备
        b>>=1;      //b/=2;
   }
    return ans;
}
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

正因为vis*vis,使得次幂会以2 4 8 16……(2^1 2^2 2^3 2^4……)上升对应着二进制数所对应的十进制数从而达到快速运算的成效。快速幂的基本思想就是这样啦

注: 片段代码或者语言如有错误望谅解并请指出。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值