做幂的最佳方法(int x,int n)?

时间:2010-03-30 02:29:15

标签: c++ algorithm math big-o

因此给定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))解决方案,有谁知道怎么做?它可以递归地完成。

5 个答案:

答案 0 :(得分:17)

可以利用的数学概念是x2n+1 = x2n ⋅ xx2n = 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 ,......并包括结果中所需的那些。