快速幂运算

知识点:快速幂运算

快速幂运算;
                    原来:当我们计算a^k时候,一定是(a*a*a*a*……a)   k个   
                    现在: 把k拆成二进制,为了表达清楚,我们这里让k=11
                    11(dec)=1011(b)=1*2^3+0*2^2+1*2^1+1*2^0  我们会发现其中有0的地方是个废操作
                    那么我们将去除这个废操作的过程叫做快速幂运算

                   2^11=2^1011=(2^1*2^3)*(2^
0*2^2 )*( 1*2^1 ) *( 1*2^0 )= (2^1*2^3)* ( 1*2^1 ) *( 1*2^0 )

                  我们把上面的每一位的二进制用b(i)表示     2^(b(i)*2^i)= 
2^(b(i)*2^(i-1)*2)=  ( 2^(b(i)*2^(i-1)2))^2
                 = 2^(b(i)*2^(i-1)2)*2^(b(i)*2^(i-1)2)

                这么做的目的是便于我们的算法,后者=前者的平方
               

              那么算法就写好了
              __int64(__int64 a,int k)
              {
                __int64 s=1;
                while(k)
                      {
                           if(k&1)//作一个与运算,这边就是在判断二进制的最后一位是否是1
                              {
                                 s=s*a
                              }
                                a=a*a//后者=前者的平方
                                k>>=1;// 将k右移移动一位,循环判断二进制是否是0,是0就不作运算
                      }
                     returrn s;
              }
                 
这样就OK了。。。 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值