第一周任务总结(快速幂)

☆樱花仙子☆ 提交于 2019-11-29 12:16:17

**

快速幂算法总结

快速幂算法的概念

  • 快速幂就是做到让程序快速求幂,减少时间复杂度,使程序更快运行

快速幂的时间复杂度

  • 若题目为求a^n的值,那此时程序的时间复杂度为O(n),但如果使用快速幂,便可以将时间复杂度减少到O(log(n))

快速幂算法的代码

int qpow(int a,int b)//首先输入两个值,表示所要运算的a^b
{
	int ans=1;   //对结果赋初值,防止之后程序运行时出错 
	while(b)  //当b!=0时运行程序 
	{
		if(b&1)  //判断此时是否需要相乘 
			ans=ans*a;
		b>>=1; 	 //让b右移一位 
		a=a*a; 	 //不断更新a的次方数
	 		//每运行一次,a的次方数加 1 
	}
	return ans;	//得到结果
}	
  • 首先输入两个值a,b(a^b),并对ans赋初值为1
  • 开始运算,在b!=0的时候,进入循环
  • 判断b的二进制数的末尾为0或是1,若为0则不相乘,为1则进行相乘
  • b的值不断更新,每次右移一位(除以2)
  • a的值不断更新,每更新一次次方数加一次
  • 当b=0时,说明对b的分解完成,退出循环

好像有点难以理解 ,再来举个栗子

例如求2的90次方
如果不用快速幂的话,程序需要运行90次,但快速幂只需要四次
首先输入a(2),b(90),开始运算,此时b(90)!=0,进入循环
b&1这里好像需要说明一下
运用了按位与运算符(&)90的二进制数为1011010,当二进制末尾位置上为0时不进行运算,当二进制末尾位置上为1时进行运算(这就是为什么每次循环都要让b右移一位了,因为要二进制的每一位究竟是0还是1)
但为什么为0时相乘,为1时不乘呢?
因为快速幂是指将所求的次方数分解
例如90的二进制数为1011010,那就说明90可以由2+8+16+64构成,2的90次方就可以计算为 2^90 = 2^(2 + 8 + 16 + 64) = 2^2 * 2^8 * 2^16 * 2^64

这样计算就可以大大减少循环次数了

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!