快速幂的C++实现

顾名思义,快速幂就是快速算底数的n次幂。其时间复杂度为 O(log₂N), 与朴素的O(N)相比效率有了极大的提高。
快速幂算法的核心思想就是每一步都把指数分成两半,而相应的底数做平方运算。这样不仅能把非常大的指数给不断变小,所需要执行的循环次数也变小,而最后表示的结果却一直不会变。
我们举个例子,假设要求a的14次方,把14转二进为:(1110) 2 _2 2,a的14次方就是a的(1110) 2 _2 2次方,示例如下:

a 14 ^{14} 14=a ( 1110 ) 2 ^{(1110)_2} (1110)2=a ( 0 + 2 + 4 + 8 ) ^{(0+2+4+8)} (0+2+4+8)=a 0 ^0 0× a 2 ^2 2 × a 4 ^4 4 × a 8 ^8 8

观察(1110) 2 _2 2这个二进制的4位,如果数字为0,不需要累乘到答案里面,如果数字为1需要累乘对应的基数(a的2 i ^i i 次方)到答案里面。
为此我们需要解决几个问题:
1、遍历14的每个二进制数

int b=14;
while(b){
  b>>=1;//右移运算,b右移一位
}

2、判断b的最后一位是不是0

if(b&1)  //

1这个数在计算机内部会转换成000…0001,b&1是b和1的按位与运算,只有b的二进制最后一位是1的情况下结果才是1

综合以上,写出求a的b次方的快次幂函数如下:

long long quickpower(long long a,long long b){
  long long ans=1,base=a;
  while (b){ //遍历b的每个二进制位
     if(b&1){//b的最后一位是1
        ans*=base;//这个时候需要累成基数
     }
     base*=base;//b的每个二进制位代表a的n个2次方(n对应第几位)
     b>>=1;
  }
  return ans;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值