因此给定x和power,n,求解X^n
。
有O(n)
的简单方法......
我可以通过
O(n/2)
numSquares = n/2;
numOnes = n%2;
return (numSquares * x * x + numOnes * x);
现在有一个O(log(n))
解决方案,有谁知道怎么做?它可以递归地完成。
答案 0 :(得分:17)
可以利用的数学概念是x2n+1 = x2n ⋅ x
和x2n = xn ⋅ xn
。
答案 1 :(得分:17)
嗯,你知道x a + b = x a x b 所以......
int pow(int x, unsigned int y)
{
if (y == 0) return 1;
if (y == 1) return x;
int a = y / 2;
int xa = pow(x, a);
if (a + a == y) // y even
return xa * xa;
else
return xa * xa * x;
}
答案 2 :(得分:9)
通常的实现是沿着这些方向(来自wikipedia article):
long power(long x, unsigned long n)
{
long result = 1;
while (n > 0) {
/* n is odd, bitwise test */
if (n & 1) {
result *= x;
}
x *= x;
n /= 2; /* integer division, rounds down */
}
return result;
}
递归是没有必要的,或者(我会说)特别理想,虽然它可以在显而易见的情况下获胜:
long power(long x, unsigned long n)
{
if (n == 0) return 1;
long result = power(x, n/2); // x ^ (n/2)
result *= result; // x ^ (n/2)*2
if (n & 1) result *= x; // x ^ n
return result;
}
当然,在任何版本中,你很快就会溢出很长时间。您可以将相同的算法应用于您最喜欢的bigint表示,尽管任何bigint库都将包含整数幂函数。
上述函数的两个版本都为power(0,0)
返回1。你可能会或可能不会认为这是一个错误。
答案 3 :(得分:2)
您可以在此处找到解释:Fast exponentiation。对于某些n值,您可以使用比使用两个技巧的幂更少的乘法来计算x ^ n。
答案 4 :(得分:1)
标准技巧是在序列x 2 ,x 4 ,x 8 ,x 16中生成x的幂,x 32 ,......并包括结果中所需的那些。