求某数n次方的算法(高效)
该算法求某个数的n次方的时间复杂度只有logN,我们平时使用的循环求时间复杂度为o(n)
int power(int x,int n)
{
int m=0;
m=n;
int t=1;
while(m>0)
{
m/=2;
t*=2;
}
m=n;
int y=1;
while(t>1)
{
t/=2;
y*=y;
if (m>=t)
{
y*=x;
m-=t;
}
}
return y;
}
原理
一般的对于 a (2x + b) = a2x * a b
所以就有
(b = 0时 ) : a 2x + b = (ax)2 ;
(b = 1时): a 2x + b = (a x)2 * a ;
对于 an ,先把 n的二进制表示写出,那么有
an = a (n1 n2 n3 n4 ..)(2) = …
从左到右就可以如下表(n = 15的时候 1111)
n的二进制位 | 1 | 1 | 1 | 1 |
累乘 | a | a2 * a = a3 | (a3)2 *a= a7 | (a7)2 * a = a15
|