题目描述
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
使用循环
public double Power(double base, int exponent) {
if(exponent==0) return 1;
if(exponent==1) return base;
double sum=base;
if(exponent<0){
exponent=Math.abs(exponent);
for(int i=2;i<=exponent;i++){
sum*=base;
}
return 1/sum;
}else{
for(int i=2;i<=exponent;i++){
sum*=base;
}
return sum;
}
}
递归版本
public double Power(double base, int exponent) {
if(base==0) return 0;
if(exponent==0) return 1;
if(exponent==1) return base;
boolean flag = true;
if(exponent<0){
exponent=-exponent;
flag=false;
}
double res=Power(base,exponent>>1);
res*=res;
if((exponent&1)==1){
res*=base;
}
return flag?res:1/res;
}
快速求幂算法
例如:
3 ^ 999
= 3 ^ (512 + 256 + 128 + 64 + 32 + 4 + 2 + 1)
= (3 ^ 512) * (3 ^ 256) * (3 ^ 128) * (3 ^ 64) * (3 ^ 32) * (3 ^ 4) * (3 ^ 2) * 3
那么把999转为2进制数:1111100111,其各位就是base的多少次方。这提示我们利用求二进制位的算法
public double Power(double base, int exponent) {
if(base==0) return 0;
if(exponent==0) return 1;
if(exponent==1) return base;
boolean flag = true;
double res=1;
if(exponent<0){
exponent=-exponent;
flag=false;
}
while(exponent>0){
if(exponent%2 ==1){
res*=base;
}
exponent=exponent>>1;
base*=base;
}
return flag?res:1/res;
}