代码之家  ›  专栏  ›  技术社区  ›  raldi

在C语言中如何求幂?

c
  •  46
  • raldi  · 技术社区  · 16 年前

    我试过“x=y**e”,但没用。

    7 回复  |  直到 7 年前
        1
  •  84
  •   Evan Teran    12 年前

    使用 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) 意志平等 权力 x . 这有一些潜在的问题,但一般来说是正确的。

        2
  •  31
  •   Community CDub    8 年前

    添加到什么 Evan said:c没有用于求幂的内置运算符,因为它不是大多数CPU的原始操作。因此,它被实现为一个库函数。

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

    注意你是这样做的 想使用 ^ 接线员,这是 按位异或 操作员。

        3
  •  23
  •   ephemient    16 年前

    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;
        }
    }
    
        4
  •  6
  •   kallikak    12 年前

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

    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;
    }
    
        5
  •  4
  •   Jonathan Leffler    7 年前

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

    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);
    }
    

    (例如,为了将一个双精度值提高到整数幂,代码被删掉了,不得不删除代码来处理倒数。)

        6
  •  2
  •   Anonymous    14 年前
    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)

        7
  •  1
  •   Garnet Ulrich    16 年前

    或者你只需要编写幂函数,加上递归。

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

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