快速幂

以下以求a的b次方来介绍 [1]  
把b转换成 二进制数
该二进制数第i位的权为例如
11的二进制是1011
11 = 2³×1 + 2²×0 + 2¹×1 + 2º×1
因此,我们将a¹¹转化为算



快速幂可以用位运算这个强大的工具实现
1
and  1 {也就是取b的二进制最低位(即第0位) 判断b是否为奇数,是则为1}
1
shr  1 {就是去掉b的二进制最低位(即第0位)}
有了这个强大的工具,快速幂就好实现了!


常规求幂

int  pow1(inta,intb)
{
     int  r=1;
     while (b--)
         r*=a;
     return  r;
}

二分求幂(一般)

int  pow2(inta,intb)
{
int  r=1,base=a;
while (b!=0)
{
     if (b%2)
         r*=base;
     base*=base;
     b/=2;
}
return  r;
}

快速求幂(位操作)

int  pow3( int  a, int  b)
{
     int  r=1,base=a;
     while (b!=0)
     {
         if (b&1)
             r*=base;
         base*=base;
         b>>=1;
     }
     return  r;
}

快速求幂(位运算,同pow3函数,但更复杂)

int  pow4( int  x, int  n)
{
     if (n==0)  return  1;
     else
     {
         while ((n&1)==0)
         {
             n>>=1;
             x*=x;
         }
     }
     int  result=x;
     n>>=1;
     while (n!=0)
     {
         x*=x;
     if ((n&1)!=0)
         result*=x;
     n>>=1;
     }
     return  result;
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值