快速幂

转载于 百度百科 https://baike.baidu.com/item/%E5%BF%AB%E9%80%9F%E5%B9%82/5500243?fr=aladdin


快速幂就是快速算底数的n次幂。其时间复杂度为 O(log₂N), 与朴素的O(N)相比效率有了极大的提高。


快速幂可以用 位运算来实现
1
and  1 {也就是取b的二进制最低位(即第0位) 判断b是否为奇数,是则为1} 
1
shr  1 {就是去掉b的二进制最低位(即第0位)} 
C++实现为
1
b & 1 //取b二进制的最低位,判断和1是否相同,相同返回1,否则返回0,可用于判断奇偶
1
b>>1 //把b的二进制右移一位,即去掉其二进制位的最低位

常规求幂

1
2
3
4
5
int  pow1( int  a, int  b){
    int  r=1;
    while (b--) r*=a;
    return  r;

快速求幂(一般)

1
2
3
4
5
6
7
8
9
int  pow2( int  a, int  b){
     int  r=1,base=a;
     while (b!=0){
     if (b%2) r*=base;
     base*=base;
     b/=2;
     }
     return  r;
}

快速求幂(位运算)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int  pow3( 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) result*=x;
     n>>=1;
   }
   return  result;
}

快速求幂(位运算,更简洁)

1
2
3
4
5
6
7
8
9
int  pow4( int  a, int  b){
   int  r=1,base=a;
   while (b){
     if (b&1) r*=base;
     base*=base;
     b>>=1;
   }
   return  r;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值