2021-08-04

快速幂

快速幂 : 简而言之呢就是 快速取幂嘛 相对于普通取幂有什么区别呢

先来看普通取幂

long long  power(int a,int b){
	long long sum=1;
	for(int i=0;i<b;i++){
		sum*=a;
	}
	return sum;
}

显而易见的是 我们计算a 的 b 次时 需要连续 * a b 次 那么他的时间复杂度则为O(n)

而快速幂是用了什么方法使时间复杂度下降的呢

想象一下当我们计算3的13次方时

3^13 = 3^2^3 * 3^2^2 * 3*2^0;

而13的二进制码等于1101 此时我们发现 可以利用二进制来快速的进行幂运算 此时时间复杂度则变成了log2(n)
而且我们发现在二进制码中 1 才带来价值 所以我们只需要一直将该二进制码右移动的来取 其有效位 再乘上他的基数就好了

二进制——————————基数—————————— 结果
1101———————————3———————————— 3
110 ———————————9 ————————————3
11————————————81————————————3 * 81
1————————————6561——————————3 * 81 * 6561

由此可得再写出代码

long long quickpower(int a,int b){
	long long sum=1;
	long long base=a;
	while(b){
		if(b&1){
			sum*=base;
		}
		b>>=1;
		base*=base;
	}
	return sum;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值