方法一:使用内置函数Math.pow(base,exponent)
方法二:暴力递归解法
public class Solution {
public double Power(double base, int exponent) {
if(exponent==0&&base!=0){
return 1D;
}
if(exponent==1){
return base;
}
if(exponent>1){
return Power(base,exponent-1)*base;
}
if(exponent<0){
return 1/(Power(base,-exponent-1)*base);
}
return 0;
}
}
方法三:快速幂算法,非递归实现
例如求a的11次方,记作a^11.
a^11 = a(2 ^ 0 + 2 ^ 1 + 2 ^ 3) = a ^(1011);
所以,我们得出结果:a^11 = (a ^ (2 ^ 3)) *( a ^(2 ^ 1)) *( a^(2 ^ 0));
寻找其规律,得知每次它的基数会变成其平方,详细看代码
public class Solution {
public double Power(double base, int exponent) {
if(exponent==0&&base!=0){
return 1D;
}
if(exponent==1){
return base;
}
int exp=exponent>0?exponent:-exponent;
double result=1;
while(exp>0){
if( (exp&1)==1){
result*=base;
}
exp>>=1;
base*=base;
}
return exponent>0?result:1/result;
}
}
方法四:快速幂算法,递归实现
例如:
a^11 = a ^(1011);
a^(1011)=[ ( a^(101) )^2 ]* a; //最后一位为1
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
a^10 = a ^(1010);
a^(1010)=[ ( a^(101) )^2 ]; //最后一为为0
可以发现,将exponent右移后的结果与原来的结果的关系
注意:
1.递归出口为exponent为1,返回base
代码:
public class Solution {
public double Power(double base, int exponent) {
if(exponent==0&&base!=0){
return 1D;
}
if(exponent==1){
return base;
}
int exp=exponent>0?exponent:-exponent;
double result=pow(base,exp);
return exponent>0?result:1/result;
}
public static double pow(double base, int exponent){
if(exponent==0&&base!=0){
return 1D;
}
if(exponent==1){
return base;
}
double result=pow(base,exponent>>1);
result*=result;
if((exponent&1)==1){
result*=base;
}
return result;
}
}