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.这有一些潜在的问题,但通常是正确的.
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)
与之前的答案类似,这将很好地处理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)
该函数的非递归版本并不太难——这里是整数:
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 值提高到整数幂而修改了代码 - 例如,必须删除代码以处理倒数。)