天天看点

剑指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;
	}
}