題目描述
給定一個double類型的浮點數base和int類型的整數exponent。求base的exponent次方。
保證base和exponent不同時爲0
思路1:
C++題解:如果底數爲0,並且指數爲負,如果不進行處理,那麼會出現對0求倒數的情況。0的零次方在數學上是沒有意義的,所以輸出是0或者是1都可以。其它數的0次方都是1,因此將result的默認值賦爲1。注意返回值得類型是double類型啊,python寫久了C++總是忘記打分號,罪人。又一次發現牛客網測試用例不全,也是醉了,如果沒有考慮到底數爲0指數爲負的情況也會給過。
class Solution {
public:
double Power(double base, int exponent) {
double result=1.0;
if(base==0.0&&exponent<=0)
return 0.0;
if(exponent<0){
exponent=exponent*(-1);
for(int i=0;i<exponent;i++){
result=result*base;
}
return 1.0/result;
}
else{
for (int i=0;i<exponent;i++)
result=result*base;
return result;
}
}
};
思路2:求次方可以再優化一下,如果是偶數次方,把它變成平方平方相乘a^(n/2)*a^(n/2),如果是奇數次方,把它變成a^((n-1)/2)*a^((n-1)/2)*a,還是用遞歸的思想。這裏遞歸函數裏的關鍵是新創建一個變量result時調用遞歸,將遞歸調用的結果和它自身相乘。
C++題解:
class Solution {
public:
double Power(double base, int exponent) {
if(base==0.0&&exponent<=0){
return 0.0;
}
unsigned int absexp=(unsigned int)exponent;
if(exponent<0)
absexp=(unsigned int)(-exponent); //如果指數小於0的話,就讓指數變爲相反數
double result=calculatepow(base,absexp);
if(exponent>0)
return result;
else
return 1/result;
}
double calculatepow(double base,int exponent){
if(exponent==0)
return 1.0;
if(exponent==1)
return base;
double result=Power(base,exponent/2); //指數對半分
result=result*result; //再相乘又是原來的數
if(exponent&0x1==1) //奇數
return result*base; //指數爲奇數那麼分解後要多乘一個底數
else
return result;
}
};