小小算法之路 Day1 快速幂运算

①例如求两个数a*b

   小学里我们把这道式子看成是b个a的相加,现在我们把b变成一个二进制的式子 ex:3*53->可以看成3*(110101)->3*(100000*1+10000*1+1000*0+100*1+10*0+1*1)

   对于判断b的对应的二进制的每个位是1或是0,这里用到b&1可以判断当前位是1或0;

    下面贴函数来理解

  public int f(int a,int b)

{   

     int res=0; //用来记录每次b移位后的和;

     while(b!=0)

     {

         if((b&1)!=0)

          {

             res+=a;

           }

      b>>=1;// 移位

     a=(a+a);  //更新a的值;

    }

return  res;


}


有了上面的基础,我们再扩展到a^b 对于a^b这里有所不同了  3^(100000*1+10000*1+1000*0+100*1+10*0+1*1)每次更新值后,记录值乘上更新后的a

   public int  multiply(int a,int b)

{

       int res=1;

      while(b!=0)

{

    if((b&1)!=0)

     {

     res=f(res,a);      

   b>>=1;

   a=f(a,a);

}

return res

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值