题目描述:
- 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
保证base和exponent不同时为0。
注意:
- 在判断底数base是不是等于0时,不能直接写base == 0。因为在计算机内部表示小数(包括float和double型小数)都有误差。如果两个小数的差的绝对值很小,比如小于0.0000001,就可以认为它们相等。
- 用递归实现,时间复杂度为O(logn)。
优化:
(1) 用位运算右移代替除以2,提高运算效率;
(2) 用if ((a & 1) == 0)代替if (a % 2 == 0)来判断a是不是偶数。
代码实现:
public class S_Power {
public static double Power(double base, int exponent) {
//1.底数为0,指数不为0,返回0.0
if (((equal(base, 0.0)) && exponent < 0) || ((equal(base, 0.0)) && exponent > 0)) {
return 0.0;
}else if((equal(base, 0.0)) && equal(exponent, 0.0)){
return 0.1;
}else {
int absExponent = exponent;
//指数若为负,取绝对值
if (exponent < 0){
absExponent = -exponent;
}
double result = q_Power(base, absExponent);
//指数若为负,次方的结果取倒数
if (exponent < 0){
result = 1.0 / result;
}
return result;//返回结果
}
}
private static double q_Power(double base, int exponent) {
//底数不为0,指数为0,直接返回1
if(exponent == 0){
return 1;
}
//用位运算右移代替除以2,提高运算效率
double result = q_Power(base, exponent >> 1);
result *= result;
//用if ((a & 1) == 0)代替if (a % 2 == 0)来判断a是不是偶数
//偶数:a*a
//奇数:a*a*base
if((exponent & 1) == 1){
result *= base;
}
return result;
}
//判断底数base是否等于0
private static boolean equal(double num1,double num2){
if ((num1 - num2 > -0.0000001) && (num1 - num2 < 0.0000001)){
return true;
}else {
return false;
}
}