第2天 数值的整数次方


题目:实现函数ondouble Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。


注意:

1. 参数base与exponent的值都有三种情况 正数、0、负数

2. double的精度问题,如果比较介意0.000001的偏差可以使用BigDecimal。


/**
 *  面试题11
 *  
 *  2014-1-16
 */
public class Power {

	double power(double base, int exponent) {
		if (equal(base, 0.0) || exponent <= 0) {
			return 0.0;
		} else if (exponent == 1) {
			return base;
		}

		double result = getPowerValue(base, exponent >> 1);
		result *= result;
		if ((exponent & 0x1) == 1) {
			// 奇数还需要再乘以base
			result *= base;
		}
		
		// 负负得正但是负数的N次方依然是负数
		if (base < 0 && result > 0) {
			result = -result;
		}
		
		return result;
	}
	
	
	double getPowerValue(double base, int exponent) {
		
		double result = 1.0;
		for (int i = 0; i < exponent; i++) {
			result *= base;
		}
		
		return result;
	}
	
	boolean equal(double num1, double num2) {
		if (num1 - num2 < 0.0000001 && num1 - num2 > -0.0000001) {
			return true;
		}
		return false;
	}
	
	public static void main(String[] args) {
		Power power = new Power();
		
		boolean flag = true;
		
		flag &= power.equal(power.power(9, 3), 729.0);
		flag &= power.equal(power.power(3, 0), 0.0);
		flag &= power.equal(power.power(3, -1), 0.0);
		flag &= power.equal(power.power(0, 0), 0);
		flag &= power.equal(power.power(-2.1, 4), -19.4481);
		flag &= power.equal(power.power(-2.1, 0), 0);
		flag &= power.equal(power.power(-2.1, -3), 0);
		
		System.out.println(flag);
	}

}


参考资料:

《剑指Offer》面试题11



你可能感兴趣的:(第2天 数值的整数次方)