我正在创建一个指数函数求值程序(即一个函数EXPO(int q,int p),它评估不使用递归的q ^ p),我有点坚持如何这样做。你会把q乘以q次,还是我错过了什么?
答案 0 :(得分:2)
假设指数是非负的:
long long int exp(int b, int e)
{ long long int r = 1;
long long int b_ = 1ll * b;
while(e > 0)
{ if(e & 1) r *= b_;
b_ *= b_;
e >>= 1;
}
return r;
}
这需要对数时间,因为我们遍历指数的位。
答案 1 :(得分:1)
除非p
为否定,否则就是全部。
答案 2 :(得分:1)
明确地不会使用“你会把q乘以q倍” - 这是不必要的低效率。
另一方面,即使使用unsigned long long
,许多值也会快速溢出。
以下在O(log2(b))时间内运行。
与@saadtaame没什么不同,但更喜欢处理unsigned
数学。
// return `a` raised to the `b` power.
unsigned long long ipower(unsigned a, unsigned b) {
unsigned long long y = 1;
unsigned long long power = a;
while (b) {
if (b % 2) y *= power;
b /= 2;
power *= power;
}
return y;
}
注意,这会返回ipower(0,0) --> 1
,这是0,0
特殊情况的常见预期结果。数学上可以对0
,1
或其他结果(包括错误)的结果进行论证。 1
适合许多需求。
答案 3 :(得分:0)
对于无符号指数,你所拥有的(大多数)是正确的,你只需要处理自n0 = 1
以来零的边缘情况。伪代码如下:
def power(base,power):
result = 1
while power > 0:
result = result * base
power = power - 1
return result
对于负面力量(如果你是如此倾向),你只需要意识到n-x = 1 / nx
:
def power(base,power):
pneg = false
if power < 0:
power = -power
pneg = true
result = 1
while power > 0:
result = result * base
power = power - 1
if pneg:
result = 1 / result
return result