12.数值的整数次方
第一种方法:使用递归,时间复杂度O(logn)
public class Solution {
public double Power(double base, int exponent) {
int n=Math.abs(exponent);
double result=0.0;
if(n==0) return 1.0;
if(n==1) return base;
result=Power(base,n>>1);//递归处
result *=result;
if((n&1)==1) result*=base; //如果指数为奇数,则要在乘一次底数base;
if(exponent<0) result=1/result;//如果指数为负数,则应该求result的倒数;
return result;
}
}
第二种方法:累乘,时间复杂度为O(n)
public class Solution {
public double Power(double base, int exponent) {
double result=1;
if(base==0) return 0;
for(int i=0;i<Math.abs(exponent);i++){
result*=base;
}
if(exponent<0){
result=1/result;
}
return result;
}
}
二刷:
也是累乘的方式,只不过考虑的特殊情况多一些:
对于递归的方式我还不是很理解
public class Solution {
public double Power(double base, int exponent) throws Exception{
/*
1.考虑 base = 0.0 ,exponent <0 做幂运算为无穷大,此时抛出异常
2.当 base = 0.0 ,exponent = 0 时返回1.0.以及任何数的0次方均为1.
3.考虑exponent正负数的情况
*/
double res=1.0;
if(base==0&&exponent<0){
throw new RuntimeException("0的负数次幂没有意义");
}
if(exponent==0)
return 1.0;
for(int i=1;i<=Math.abs(exponent);i++){
res*=base;
}
if(exponent<0)
return 1/res;
return res;
}
}