快速幂运算

人盡茶涼 提交于 2020-03-02 22:38:08

快速幂运算:

对于一个数x,我们对其进行n次幂运算。如果按照一般的算法,也就是x * x * x…,这样的复杂度为O(n2)。
如果我们利用快速幂运算,那么复杂度为O(logn),效率就会有极大的提高。

那么如何进行快速幂运算?
我们对x进行n次幂运算,此时如果n可以表示为2的幂次的和,n表示为:n=2k1+2k2+2k3…。那么xn=x2的k1次 × x2的k2次× x2的k3次…。这样,在求每个分量的同时计算出x的n次幂,比一般的算法节约时间。

 

C代码实现:

#include <stdio.h>
#include <stdlib.h>

typedef long long ll;

ll power(ll x,ll n){
	ll res=1;
	while(n>0){
		if(n & 1) res=res*x;   //n&1,将n表示为二进制形式,最低位为1,则执行
		x=x*x;
		n>>=1;   //二进制的n右移且高位补零之后再赋值给n。>=有点像+=等的用法
	}
	return res;
}

int main(int argc, char *argv[]) {
	ll x,n,res;
	scanf("%ld %ld",&x,&n);
	res=power(x,n);
	printf("%ld",res);
	
	return 0;
}

递归实现:

#include <stdio.h>
#include <stdlib.h>

typedef long long ll;

ll power(ll x,ll n){
	if(n==0) return 1;
	ll res=power(x*x,n/2);
	if(n&1) res=res*x;
	return res;
}

int main(int argc, char *argv[]) {
	ll x,n,res;
	scanf("%ld %ld",&x,&n);
	res=power(x,n);
	printf("%ld",res);
	return 0;
}

对递归代码举出例子:
如2的22次幂
①res=power(2*2,1011)
②res=power(22×22,101)
③res=power(24×24,10)
④res=power(28×28,1)
⑤res=power(216×216,0)
从此开始递归返回值:
res=1,不满足if条件,不执行⑤的if
满足④的if,执行,res=216
不满足③的if,res=216
满足②的if,执行,res=216×24
满足①的if,执行,res=216×24×22
最后得出结果res

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