16.數值的整數次方

題目描述

給定一個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;
    }
};

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章