【劍指Offer】面試題11:數值的整數次方

整理自劍指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;

    }
};

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