快速幂(c++)

a n a^n an 正常实现得时间复杂度为O(n)
快速幂得时间复杂度为O(log n)

主要思想就是以二进制的角度看待 n,然后去将每一位的0,1状态做处理就可以1

看一个例子就容易理解了

比如 3 11 3^{11} 311

11的二进制为1011

现在就变成了

3 二 进 制 1011 3^{二进制1011} 31011
而其中的
1011 = 2 3 + 2 2 ∗ 0 + 2 1 + 2 0 1011 = 2^3+2^2*0+2^1+2^0 1011=23+220+21+20

之后就成了
3 2 3 + 2 2 ∗ 0 + 2 1 + 2 0 3^{2^3+2^2*0+2^1+2^0} 323+220+21+20
转化一下
3 2 3 ∗ 3 2 2 ∗ 0 ∗ 3 2 1 ∗ 3 2 0 3^{2^3}*3^{2^2*0}*3^{2^1}*3^{2^0} 3233220321320

代码

int pow(int a, int b){
	int res = 1;
	// 循环次数为log b 次
	while(b){
		// 当b的二进制最低1位为1的时候
		if(b&1) res*=a;
		// 3^{2^i}
		a*=a;
		// b右移1位
		b>>=1;
	}
	return res;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Joshua_yi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值