我试过“x = y ** e”,但这没效果。
答案 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) );
}
是的,是的,我知道这是不太有效的空间和时间复杂性,但递归更有趣!!