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

来源:互联网 发布:恒生杠杆软件 编辑:程序博客网 时间:2024/06/04 23:21

①例如求两个数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
原创粉丝点击