题目描述
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
思路
首先要把所有的情况都考虑在内,比如基数和指数为0的情况,指数为负数的情况。
然后说一下一种比较优的思路,比如一个数的32次方,它与这个数16次方的平方相等,依次类推,求一个数的32次方只需做5次乘方,先求平方,平方的基础上求四次方,在四次方基础上求八次方,在八次方基础上求十六次方,在十六次方基础上求三十二次方。
可以总结为公式: an = a(n/2)*a(n/2) n为偶数
an = a(n-1/2)*a(n-1/2)*a n为奇数
而n/2使用右移运算符
代码
public double Power(double base, int exponent) {
if(base == 0 ){
return 0.0;
}
double res =1.0;
double odd = base;
int n = exponent;
if(exponent<0){
n=-exponent;
}
while(n != 0){
if((n & 1) == 1){
res *= odd; //奇数
}
odd *= base; //指数为偶数,
n >>= 1;
}
return exponent>0 ? res:(1/res);
}
需要注意的一点,n & 1是判断n奇偶,等于0为偶数,等于1为奇数,上面最后一个循环的代码实现了上面的公式。