对于幂运算 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.youkuaiyun.com/prstaxy/article/details/8740838