在上一篇素性检验中,我们运用了库函数pow来求得的值,这是非常方便快速的。
如果不使用pow,我们如何编写一个函数来求得一个数的整数次幂呢?
第一种方法
这是最简单的思路,对于,我们有:
当n大于0时,我们使n个x相乘
n小于0时,我们使n个x相乘,最后取其倒数
该算法的时间复杂度为O(n)
当n很大时,我们需要迭代的次数将会非常多
第二种方法——快速幂
我们先来观察一个式子——
=3*3*3*3*3=**3=*3=81*3
由此可以发现:迭代的次数分别为5,3,2
由规律,对于快速幂函数Mypow(x,n)我们有:
当n为偶数时 Mypow(x,n)=Mypow(,n/2)
n为奇数时,Mypow(x,n)=Mypow(,n/2)*x
其中/为整数除法
不难发现,这是一个递推式,我们可以使用递归的方法来实现
也可以使用迭代的方法,从而减少占用的空间
实现代码如下:
double pow2(double x, long long n){//先算n>=0的情况
double ans=1.0;
double c=x;
while(n>0){
if(n&1){//n为奇数
ans*=c;//答案乘上多出的x
}
c*=c;//x变为x的平方
n>>=1;//n缩小一半
}
return ans;
}
double Mypow(double x, int n){
long long N=n;
return N>0?pow2(x,N):1.0/pow2(x,-N)
}