题目描述
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
一开始最简单的思路是,用一个while循环直接乘出结果,太简单代码就不贴了,复杂度是O(n)。
发现有更快的算法,叫快速幂,复杂度为O(lgn)。
代码:
public class Solution {
public double Power(double base, int exponent) {
double result = 1.0;
int n = exponent;
if(exponent < 0){
n = -exponent;
}
else if(n == 0){
return 1;
}
while(n != 0){
//n是奇数
if( (n&1) == 1){
result = result * base;
}
base = base * base;
n = n>>1;
}
if(exponent < 0){
return 1/result;
}
return result;
}
}
原理:
a^b
b为偶数:a^b = a^(b/2) * a ^(b/2) = (a2)(b/2)
b为奇数:a^b = a^((b-1)/2) * a^((b-1)/2) * a = (a2)(b/2) * a
快速幂也叫快速幂取模算法,是一种高效的指数求模算法。
只要在我们上述原理后面加上%n就是就指数模n的结果了。