快速幂初步学习

快速幂顾名思义就是快速求幂,也常用于求幂的模(余数)

例如求Xq,常规算法是乘qX,时间复杂度为O(n),而快速幂复杂度为O(log2n),我们看下如何实现

n用二进制可写成2k1+2K2+...2kn

Xn=X2^k1+2^k2+...+2^kn=X2^k1·X2^k2·...·X2^kn 

从二进制n的末尾开始,累乘x,即通项为X2^kn ,若n的该位为1累乘通项,从右往左删掉n的每一位直到n为0

int fun(int x,int n){
	int ans=1,base=x;
	while(n!=0){
		if(n&1)		//若二进制数最后一位为1返回1 
			ans*=base;
		base*=base; 
		n>>=1;		//去掉二进制数n最后一位
	}
	return ans;
}

  

原文地址:https://www.cnblogs.com/NDKY9/p/6822612.html