你如何用C进行取幂?

ral*_*ldi 51 c

我试过"x = y**e",但那没用.

Eva*_*ran 89

使用该pow功能(虽然需要floats/doubles).

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);
Run Code Online (Sandbox Code Playgroud)

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

  • 我不确定编译器优化是否仍然如此,但位移是CPU上最快的操作之一.如果可能的话,我会采取这种方法. (4认同)

Ada*_*eld 33

添加到Evan所说的内容:C没有用于取幂的内置运算符,因为它对于大多数CPU来说不是原始操作.因此,它被实现为库函数.

此外,用于计算函数e ^ X,你可以使用exp(double),expf(float)expl(long double)功能.

请注意,您希望使用^运算符,它是按位异或运算符.


eph*_*ent 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;
 }
Run Code Online (Sandbox Code Playgroud)

这是一个递归解决方案,它占用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;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 但是效率低,并且舍入误差*会在结果接近INT_MAX时产生差异. (4认同)

kal*_*kak 6

与之前的答案类似,这将很好地处理double的正负整数幂.

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;
}
Run Code Online (Sandbox Code Playgroud)


Jon*_*ler 5

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

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);
}
Run Code Online (Sandbox Code Playgroud)

(为了将 double 值提高到整数幂而修改了代码 - 例如,必须删除代码以处理倒数。)

  • 是的,O(1) 空间 O(log n) 时间使这比递归解决方案更好,但不太明显。 (2认同)