12、数值的整数次方
题目描述
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。保证base和exponent不同时为0
解法1:内置函数
public int power(base,exponent){
return Math.pow(base,exponent);
}
解法2:暴力法
// 解法2,暴力求解
public double Power1(double base,int exponent){
if(exponent==0){
return 1;
}
boolean isFushu = exponent>0?false:true;
int absExponent=Math.abs(exponent);
double rs=1;
for(int i=1;i<=absExponent;i++){
rs=rs*base;
}
return isFushu==true?1/rs:rs;
}
解法3:二分法
/*
* 思路:
* --exponent<0
* --当正数处理,取倒数
* --exponent>0
* --exponent奇数
* --pow(base,exponent)=base*pow(base,exponent/2)*pow(base,exponent/2)
* --exponent偶数
* --pow(base,exponent)=pow(base,exponent/2)*pow(base,exponent/2)
*
* 这种形式的递归,画树可以看出来,它是单边树,时间复杂度为O(logn)
*/
public double Power2(double base,int exponent){
double rs=0;
if(exponent==0){
return 1;
}
if(exponent==1){
return base;
}
boolean isFushu = exponent>0 ? false:true;
int absExponent=Math.abs(exponent);
// 偶数
if(absExponent%2==0){
rs=Power2(base, absExponent/2)*Power2(base, absExponent/2);
}else{
rs=base*Power2(base, absExponent/2)*Power2(base, absExponent/2);
}
return isFushu==true?1/rs:rs;
}
解法4:位运算
/*
* 将指数换成二进制,二进制中的1对应着不同的base
*/
public double Power3(double base,int exponent){
double rs=1;
if(exponent==0){
return 1;
}
if(exponent==1){
return base;
}
boolean isFushu = exponent>0 ? false:true;
int absExponent=Math.abs(exponent);
while(absExponent!=0){
if((absExponent&1)>0){
rs=rs*base;
}
absExponent=absExponent>>1;
base=base*base;
}
return isFushu==true?1/rs:rs;
}