冪運算的O(lgn)演算法
阿新 • • 發佈:2019-01-10
對於冪運算 a^b,最原始的方法是用for迴圈一遍:
double powRaw(double base,int n)
{
double r = 1;
for(int i=1;i<=n;i++)
r = r*base;
return r;
}
考慮如下下面的事實:
對於r = a^b,若b為偶數,那麼r = a^(b/2)·a^(b/2);若b為奇數,那麼r = a^((n-1)/2)·a^((n-1)/2)·a。利用這個事實可以得到如下的遞迴解法:
double pow(double base,int n) { if (n == 0) return 1; if (n == 1) return base; double t = pow(base,n >> 1); if (n & 0x1) return t*t*base; else return t*t; }
另外,b用二進位制表示,那麼a^b可以看到r = a^(1011) = a^(1000)·a^(10)·a^(1),那麼可以得到其非遞迴演算法如下:
double power(double base,unsigned int n)
{
double r = 1;
while(n)
{
if (n & 0x1)
r *= base;
n = n >> 1;
base *= base;
}
return r;
}
參考文章:
http://blog.csdn.net/prstaxy/article/details/8740838