利用模运算的性质
(x × y) modulo b == ((x modulo b) × (y modulo b)) modulo b
使用上面的乘法规则
(a^n) modulo b
= (a × a × a × a ... × a) modulo b
= ((a modulo b) × (a modulo b) × (a modulo b) ... × (a modulo b)) modulo b
通过分而治之的方法计算结果。递归关系将是:
f(x, n) = 0 if n == 0
f(x, n) = (f(x, n / 2))^2 if n is even
f(x, n) = (f(x, n / 2))^2 * x if n is odd
这里是 C++ 实现:
int powerUtil(int base, int exp, int mod) {
if(exp == 0) return 1;
int ret = powerUtil(base, exp / 2, mod) % mod;
ret = 1LL * ret * ret % mod;
if(exp & 1) {
ret = 1LL * ret * base % mod;
}
return ret;
}
double power(int base, int exp, int mod) {
if(exp < 0) {
if(base == 0) return DBL_MAX; // undefined
return 1 / (double) powerUtil(base, -exp, mod);
}
return powerUtil(base, exp, mod);
}
时间复杂度为O(logn)。
Here is my original answer。希望对您有所帮助!