你如何在C中取幂?
我尝试过“x = y ** e”,但那不起作用。
使用pow
函数(虽然需要float
s / double
s)。
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);
编辑:顺便说一句,对于2
的正整数幂的特殊情况,您可以使用位移: (1 << x)
将等于2
的权力x
。 这有一些潜在的问题,但通常这是正确的。
为了增加Evan所说的话:C没有内置的求幂运算符,因为对于大多数CPU来说这不是一个原始的操作。 因此,它被实现为一个库函数。
另外,为了计算函数e ^ x,可以使用exp(double)
, expf(float)
和expl(long double)
函数。
请注意,您不希望使用^
运算符,它是按位异或的运算符。
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; }
这是一个recursion的解决scheme,它需要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; } }
与之前的答案类似,这将很好地处理双正负整数幂。
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; }
该函数的非recursion版本不是太难 – 在这里是整数:
long powi(long x, unsigned n) { long p; long r; p = x; r = 1.0; while (n > 0) { if (n % 2 == 1) r *= p; p *= p; n /= 2; } return(r); }
(例如,将代码提升为一个整数倍的代码 – 必须删除代码来处理倒数。)
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; };
(如果它必须是recursion的)
imo,algorithm肯定是O(logn)
或者你可以写权力函数,recursion作为额外的奖励
int power(int x, int y){ if(y == 0) return 1; return (x * power(x,y-1) ); }
是的,是的,我知道这是不太有效的空间和时间复杂性,但recursion只是更有趣!
这是如何 – http://algohub.blogspot.com/2014/04/exponentiation.html
它是一个分而治之的algorithm。将input分解成小部分,直到它变得可咀嚼并解决,然后使用小问题的结果逐步构build更大问题的解决scheme,直到解决了给定input的问题
它直截了当..如果你有问题,我知道