你如何用C进行取幂?

时间:2008-10-17 17:24:24

标签: c

我试过“x = y ** e”,但这没效果。

7 个答案:

答案 0 :(得分:87)

使用pow函数(虽然需要float s / double)。

man pow

   #include <math.h>

   double pow(double x, double y);
   float powf(float x, float y);
   long double powl(long double x, long double y);

编辑:BTW,对于2的正整数幂的特殊情况,您可以使用位移:(1 << x)将等于2到幂x。这有一些潜在的问题,但通常是正确的。

答案 1 :(得分:31)

添加到Evan所说的内容:C没有用于求幂的内置运算符,因为它不是大多数CPU的基本运算。因此,它被实现为库函数。

此外,为了计算函数e ^ x,您可以使用exp(double)expf(float)expl(long double)函数。

请注意,您想要使用^运算符,它是按位异或OR / em>运算符。

答案 2 :(得分:23)

pow仅适用于浮点数(double s,实际上)。如果你想获取整数幂,并且不知道基数是2的指数,你就必须自己动手。

通常愚蠢的方式足够好。

int power(int base, unsigned int exp) {
    int i, result = 1;
    for (i = 0; i < exp; i++)
        result *= base;
    return result;
 }

这是一个递归解决方案,它占用O(log n)空格和时间,而不是简单的O(1)空格O(n)时间:

int power(int base, int exp) {
    if (exp == 0)
        return 1;
    else if (exp % 2)
        return base * power(base, exp - 1);
    else {
        int temp = power(base, exp / 2);
        return temp * temp;
    }
}

答案 3 :(得分:6)

与之前的答案类似,这将很好地处理双倍的正整数幂和负整数幂。

double intpow(double a, int b)
{
  double r = 1.0;
  if (b < 0)
  {
    a = 1.0 / a;
    b = -b;
  }
  while (b)
  {
    if (b & 1)
      r *= a;
    a *= a;
    b >>= 1;
  }
  return r;
}

答案 4 :(得分:4)

函数的非递归版本并不太难 - 这里是整数:

long powi(long x, unsigned n)
{
    long p = x;
    long r = 1;

    while (n > 0)
    {
        if (n % 2 == 1)
            r *= p;
        p *= p;
        n /= 2;
    }

    return(r);
}

(用于将双值提升为整数幂的代码被黑掉 - 例如,必须删除处理倒数的代码。)

答案 5 :(得分:2)

int power(int x,int y){
 int r=1;
 do{
  r*=r;
  if(y%2)
   r*=x;
 }while(y>>=1);
 return r;
};

(迭代)

int power(int x,int y){
 return y?(y%2?x:1)*power(x*x,y>>1):1;
};

(如果必须递归)

imo,算法肯定应该是O(logn)

答案 6 :(得分:1)

或者你可以写一下幂函数,递归作为额外的奖励

int power(int x, int y){
      if(y == 0)
        return 1;
     return (x * power(x,y-1) );
    }

是的,是的,我知道这是不太有效的空间和时间复杂性,但递归更有趣!!