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;
}
}
劍指Offer_數值的整數次方_12
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.