面试题16:数值的整数次方
实现函数double Power(double base,int exponent),求base的exponent次方。
不得使用库函数,同时不需要考虑大数问题
要考虑底数base不能为0
指数为0,为负等情况
优化powerWithExponent()方法
我们可以直接借助于乘方的数学公式进行求解。
a^n = a^(n/2) * a^(n/2);n为偶数;
a^n = a^[(n-1)/2] * a^[(n-1)/2] * a;n为奇数;
package jianZhiOffer;
/*
* 面试题16:数值的整数次方
* 题目:实现函数double Power(double base,int exponent),求base的exponent次方。
* 不得使用库函数,同时不需要考虑大数问题
*/
public class Demo16 {
//计算n次方的方法
public double powerWithExponent(double base, int exponent) {
if(exponent == 1){
return base;
}
double result = powerWithExponent(base, exponent >> 1); //用右移运算代替了除以2
result*=result;
if((exponent & 0x1) == 1){ //用位与运算符代替了求余运算符(%)来判断一个数是奇数还是偶数,如果是奇数还需要再乘一个base
result*=base;
}
return result;
}
// 数值比较的方法
public boolean equal(double num1, double num2) {
if (Math.abs(num1 - num2) < 0.0000001) {
return true;
} else {
return false;
}
}
public double power(double base, int exponent) {
double result = 0.0;
// 首先比较底数为0,指数为负数的情况,这种情况没有意义
if (this.equal(base, 0.0) && exponent < 0) {
try {
throw new Exception("没有意义");
} catch (Exception e) {
e.printStackTrace();
}
}
// exponent的三种情况
if (exponent == 0) { // exponent为0的情况
return 1.0;
} else if (exponent < 0) { // exponent小于0的情况
result = this.powerWithExponent(1 / base, -exponent);
} else if (exponent > 0) { // exponent大于0的情况
result = this.powerWithExponent(base, exponent);
}
return result;
}
public static void main(String[] args) {
Demo16 m1 = new Demo16();
System.out.println(m1.power(2, 2));
System.out.println(m1.power(0, 3));
System.out.println(m1.power(-2, 3));
System.out.println(m1.power(2, -3));
System.out.println(m1.power(2, 0));
}
}