快速幂

快速幂是个好东西 ,有时候一些题目需要求高次幂(例如: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;
}

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

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

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值