整理自劍指Offer
一:題目描述
給定一個double類型的浮點數base和int類型的整數exponent。求base的exponent次方。
二:解題思路
本題需要注意幾個點
1.整數次方包括正數,負數,0
正數,正常求解
負數,按照正數求解後,取倒數,注意base爲0的情況,分母不能爲0
0:任何數的0次方均爲1
2.base=0的情況 exponent整數,返回0
負數拋出異常(或用全局變量表示輸出的0是合法的還是異常)
0,返回1
3.base是否等於0,不可以直接用base==0(因爲float與double都有誤差) 如果兩個小數差的絕對值小於0.0000001,則認爲兩數相等
4.除以2,用>>右移運算符
判斷是否爲基數,用&與運算符,可以提高效率
5.優化求冪函數
當n爲偶數,a^n =(a^n/2)*(a^n/2)
當n爲奇數,a^n = a^[(n-1)/2] * a^[(n-1)/2] * a
三:代碼實現
class Solution {
public:
bool invalidInput=false; //判斷返回的0是異常true,還是正常輸出false
//差值絕對值小於0.0000001,認爲兩數相等
bool equal(double num1,double num2){
if(num1-num2>-0.0000001 && num1-num2<0.0000001)
return true;
else
return false;
}
double PowerCore(double base,int exponent){
if(exponent==0)
return 1;
if(exponent==1)
return base;
double result=PowerCore(base,exponent>>1);
result*=result;
if((exponent&1)==1)
result*=base;
return result;
}
double Power(double base, int exponent) {
if(exponent==0)
return 1;//任何數的0次方爲1
if(exponent==1)
return base;//任何數的1次方爲其本身
if(equal(base,0)){
//基數0,冪指數大於0,返回0
if(exponent>0)
return 0;
//基數0,冪指數小於0,程序運行出錯
if(exponent<0){
invalidInput=true;
return 0;
}
}
int absExponent=exponent;
if(exponent<0)
absExponent=-exponent;
double result=PowerCore(base,absExponent>>1); //>>1右移一位相當除以2
result*=result;
//奇數次方
if((absExponent & 1)==1) //&1相當於求餘%
result*=base;
return exponent>0?result:1.0/result;
}
};