a=a*a快速幂

今天在刷题的时候,看到一个快速幂的算法,因为之前没接触过,所以就蒙蔽了几分钟


一开始想的是为什么求幂要移位啥的这么麻烦,不是b个a相乘就完事了嘛

后来了解到这是快速幂算法,一开始我们的求幂算法是这样的:

	private int power(int a, int b) {
		int temp=1;
		for(int i=0;i<b;i++)
			temp*=a;
		return temp;
	}
简单粗暴,就是b个a相乘,但是这样 在数规模大的时候可能有超时问题!

就比如我们在心算 2^4时候,我们并不会真正去算2^3,而是  (2^2)^2=16

快速幂算法就是利用二进制让我们少算一些东西,从而提高速度

原理是这样的:(没学专门画数学公式的软件,丑请见谅)


可以把a^2^i这些看出是基,能够把时间复杂度从 n 降到 log(n)是因为基是可以递推的,就是说你知道一个基,把它平方就是下一个基

结合移位和逻辑运算等知识,就可以写出代码:

private int power2(int a, int b) {
		int base=1;  //base可以理解为基
		while(b!=0)
		{
			if((b&1)==1)  //如果最低位为1,则乘以基;为0,不乘
				base*=a; 
			a*=a;    // 基的平方 等于 下一个基
			b=b>>1;  //右移一位
		}
		return base;
	}
在大规模问题下,快速幂算法较普通算法还是可观的



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值