欢迎来到清街老酒的博客

どんな別れがあったとしても、出会ったことには必ず意味がある

快速幂

快速幂

要计算\(a^b\)常规方法要进行b次循环,时间复杂度过高,而快速幂就是将幂运算时间复杂度将缩减到\(log_2 b\)
\(7^9\)为例,9的二进制表示为1001,\(7^9=7^8*7^1\),那么\(a^b\)就可以表示为\(a^i\)(0<=i<= b && b的二进制数从右到左第(\(log_2 i\) +1)位为1的累乘。

代码实现,用一个p存取当前用来累乘的值,每循环一次p自乘一次,b不断右移实现判断从右到左第(\(log_2 i\) +1)位是否为1。

无取模

int quickPower(int a,int b)
{
	int ans=1, p=a;
	while(b>0)
        {
	      if(b&1)
	      ans*=p;	
              p*=p;
	      b >>= 1;
	}
	return ans;
}

含取模运算

int quickPower(int a,int b,int m)
{
	int ans=1, p=a;
	while(b>0)
        {
	      if(b&1)
	      {
	            ans*=p;
	            ans%=m;
	      }		
              p*=p;
              p%=m;
	      b>>=1;
	}
        ans%=m;
	return ans;
}
posted @ 2020-08-18 13:48  清街老酒  阅读(86)  评论(0编辑  收藏  举报