数值的整数次方(Java)

题目:

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

第一思路:

直接利用for循环,循环exponent次。

代码:

public double Power(double base, int exponent){
	double result = 1.0;
	for (int i = 1; i <= exponent; i++) {
		result *= base;
	}
	return result;
}

分析:

上面的代码适合情况是指数为正数的情况。 没有考虑指数小于1的情况即指数为0和指数为负数的情况以及base为0的情况。因为题目说的是数值的整数次方,整数包括正数、0、负数。

鲁棒性比较好的代码:

// 指数为正数的情况
public double powerWithExponent(double base, int exponent) {
	double result = 1.0;
	for (int i = 1; i <= exponent; i++) {
		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;
}

第二思路:优化上面的for循环乘方代码powerWithExponent()方法

我们可以直接借助于乘方的数学公式进行求解。

a^n = a^(n/2) * a^(n/2);n为偶数;

a^n = a^[(n-1)/2] * a^[(n-1)/2] * a;n为奇数;

这是一个典型的递归问题。故乘方的实现代码如下:

public double powerWithExponent1(double base, int exponent){
	if(exponent == 0){
		return 1;
	}
	if(exponent == 1){
		return base;
	}
	double result = powerWithExponent1(base, exponent >> 1); //用右移运算代替了除以2
	result*=result;
	if((exponent & 0x1) == 1){ //用位与运算符代替了求余运算符(%)来判断一个数是奇数还是偶数,如果是奇数还需要再乘一个base
		result*=base;
	}
	return result;
}

测试:

把底数和指数分别设置为正数,负数以及0。

public static void main(String[] args) {
	Main m1 = new Main();
	System.out.println(m1.powerWithExponent(2, 2));
	System.out.println(m1.powerWithExponent1(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));
}

小结:

考查考虑问题的全面性

你可能感兴趣的:(剑指offer,面试-剑指offer刷题小结)