题目描述
实现函数double Power(doublebase, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。
double直接比较是否相等,是两数相互做差,值小于某个极限值则认为相等!
解题思路
- 循环乘法。
- 全面的考虑,当指数为负数的时候;当底数(base)是零且指数是负数的时候;0的0次方的时候。
算法图解
参考代码:
package offer;
/**
* 实现函数double power(double base,int exponent),求base的exponent次方。不能使用库函数,同时不需要考虑大数问题。
*/
public class Offer16 {
public static void main(String[] args) {
// System.out.println(power(2, 5));
// System.out.println(power2(2, 0));
System.out.println(power3(2, 5));
}
/**
* 无脑版本 但是忽略了指数为负数的情况 和0^0
*
* @param base
* @param exponent
* @return
*/
static double power(double base, int exponent) {
double result = 1.0;
for (int i = 1; i <= exponent; i++) {
result *= base;
}
return result;
}
/**
* 处理了 底数为0 指数为非正数的情况
* @param base
* @param exponent
* @return
*/
static double power2(double base, int exponent) {
int absexponent = exponent;
if (base - 0.0<0.000000001 && exponent < 0&&0.0-base>-0.00000001) {
return 0.0;
}
if (exponent < 0) {
absexponent = -exponent;
}
double result = 1.0;
for (int i = 1; i <= absexponent; i++) {
result *= base;
}
if (exponent < 0) {
result = 1.0 / result;
}
return result;
}
/**
* 分基欧 高效公式计算 奇数&0x1 =1 偶数&0x1=0 (0x十六进制)
* @param base
* @param exponent
* @return
*/
static double power3(double base, int exponent) {
if(exponent==0){
return 1;
}
if (exponent==1){
return base;
}
double result=power3(base,exponent>>1);
result*=result;
if((exponent&0x1)==1){
result*=base;
}
return result;
}
}
附录
该题源码在我的 ?Github 上面!