一、题目
实现函数double Power(double base,int exponent ),求base的exponent次方。要求:不得使用库函数,同时不需要考虑大数问题。
二、思考分析
题目不需要考虑大数问题,看似很简单,但是需要考虑全面,并且提高效率,才是面试官想要看到的结果。
需要考虑的情况 :
* 指数(exponent)等于零时;
* 指数(exponent)为正数时;
* 指数(exponent)为负数时;
* 底数(base)为零,指数也为零时;
package com.offer.jianzhi;
public class DoublePower {
// 方法一:考虑全面
public double power(double base, int exponent) {
double result = 0.0;
if (exponent == 0) {
return 1.0;
}
if (base == 0.0) {
return result;
}
if (exponent < 0) {
result = 1.0 / cal(base, -exponent);
} else {
result = cal(base, exponent);
}
return result;
}
public double cal(double base, int exponent) {
double d = 1.0;
for (int i = 0; i < exponent; i++) {
d = d * base;
}
return d;
}
// 方法二:提高效率
public double power2(double base, int exponent) {
double result = 0.0;
if (exponent == 0) {
return 1.0;
}
if (base == 0.0) {
return result;
}
if (exponent < 0) {
result = 1.0 / powerWithUnsignedExponent(base, -exponent);
} else {
result = powerWithUnsignedExponent(base, exponent);
}
return result;
}
public double powerWithUnsignedExponent(double base, int exponent) {
if (exponent == 0) {
return 1.0;
}
if (exponent == 1) {
return base;
}
double d = powerWithUnsignedExponent(base, exponent >> 1);// exponent>>1表示除以2
d *= d;
if ((exponent & 0x1) == 1) {// 判断exponent是否为奇数
d *= base;
}
return d;
}
public static void main(String[] args) {
double a = Math.pow(3, 32);// 使用库函数
System.out.println(a);
DoublePower dp = new DoublePower();// 方法一
double d = dp.power(3, 32);
System.out.println(d);
double d1 = dp.power2(3, 32);// 方法二
System.out.println(d1);
}
}