题目:实现double Power(double base,int expoent),求base的expoent次方。不得使用库函数,同时不用考虑大数问题。
注意的问题:
1、底数为零的情况
2、指数为负数的情况
3、指数为零
实数(float、double)不能直接用==,因为计算机计算有误差,如果两个数差的绝对值很小,如小于0.0000001,这认为相等。
a的n次方的数学公式:
//数字的整数次方 时间复杂度O(longN)
static double pow(double base,int expoent){
//判断base为0.0
if(equals(base,0.0)){
System.out.println("base is 0.0");
return 0.0;
}
//取指数的绝对值
int e = expoent>0 ? expoent : -expoent;
//调用计算无符号的整数乘方方法
double result = powerWithUnsignedExpoent(base,e);
//指数为负数,取其倒数
if(expoent < 0)
result = 1.0/result;
return result;
}
//判断实数,float、double的值是否相等不能用==,因为计算机计算有误差,如果两个数差绝对值很小,则认为
//两个数相同
static boolean equals(double num1,double num2) {
if(num1-num2<0.0000001 && num2-num1<0.0000001)
return true;
else
return false;
}
//计算无符号整数乘方
static double powerWithUnsignedExpoent(double base,int expoent) {
if(expoent == 0)
return 1;
if(expoent == 1)
return base;
//递归调用,用右移运算代替除以2.
double result = powerWithUnsignedExpoent(base, expoent>>1);
result *= result;
//判断expoent奇偶性,用位与运算代替求模%2
if((expoent & 0x1) == 1) //为奇数
result *= base;
return result;
}