1. 程式人生 > >數值的整數次方(Java)

數值的整數次方(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));
}

小結:

考查考慮問題的全面性