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