快速幂运算:
对于一个数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
来源:CSDN
作者:你的代码没bug
链接:https://blog.csdn.net/weixin_44915226/article/details/104619362