劍指Offer_數值的整數次方_12

package code;
//題目描述:數值的整數次方
//給定一個double類型的浮點數base和int類型的整數exponent。
//求base的exponent次方。

//解一:
//如果底數爲0,則無論指數爲多少,結果都爲0;
//如果指數爲0,則底數只要非零,結果都爲1;
//如果指數大於0,就將底數自乘指數次。
//如果指數小於0,就將底數自乘(-指數次),然後除1。

//解二:
//也可以直接調用java中Math庫中的pow函數。


//解三:
/*1.當底數爲0且指數<0時
*會出現對0求倒數的情況,需進行錯誤處理,設置一個全局變量;
*2.判斷底數是否等於0
*由於base爲double型,不能直接用==判斷
*3.優化求冪函數
*當n爲偶數,a^n =(a^n/2)*(a^n/2)
*當n爲奇數,a^n = a^[(n-1)/2] * a^[(n-1)/2] * a
*時間複雜度O(logn)*/
public class Offer12 
{
	public static void main(String[] args)
	{
		Offer12 offer = new Offer12();
		System.out.println(offer.Power2(2, 3));
	}
	
	public double Power(double base, int exponent)
	{
		int result = 0;
		
		if(base == 0)
			return 0;
		
		if(exponent == 0)
			return 1;
		else if(exponent > 0)
		{
			for(int i = 0; i < exponent-1; i++)
				result *= base;
			return result;
		}
		else// (exponent < 0)
		{
			exponent *= -1;
			for(int i = 0; i < exponent-1; i++)
				result *= base;
			return (1.0/result);
		}
		
		//return Math.pow(base, exponent);
			
	}
	
	
	boolean invalidInput = false;
	public double Power2(double base, int exponent) 
	{
		if(equal(base,0.0) && exponent < 0)
		{
			invalidInput = true;
			return 0.0;
		}
		
		int absexponent = exponent;
		if(exponent < 0)
			absexponent = -exponent;
		
		double result = getPower(base,absexponent);
		if(exponent < 0)// 如果指數爲負數,則應該求result的倒數
			result = 1.0 / result;
		return result;
	}
	public boolean equal(double num1, double num2)
	{
		if(num1 - num2 > -0.000001 && num1 - num2 < 0.000001)
			return true;
		else
			return false;
	}
	public double getPower(double b, int e)
	{
		if(e == 0)
			return 1.0;
		if(e == 1)
			return b;
		double result = getPower(b,e>>1);
		result *= result;
		if((e&1) == 1) // 如果指數n爲奇數,則要再乘一次底數base
			result *= b;
		return result;
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章