1. 程式人生 > >劍值offer66題之每日一題——第十二題

劍值offer66題之每日一題——第十二題

題目描述:

         給定一個double型別的浮點數base和int型別的整數exponent。求base的exponent次方。

思路:1.當底數小於0且指數大於0,出現除0錯誤要處理

             2.判斷double底數是否為0,不能用==

             3.優化求冪運算:n=偶數:b的n次方=b的(n/2)次方 * b的(n/2)次方;n=奇數:b的n次方=b的((n-1)/2)次方* b的((n-  1)/2)次方 * b。

             4.除2運算用左移:e>>1

             5.判斷奇數用(e&1)==1

程式碼實現:

bool equal(double a,double b)
    {
        if(abs(a-b)<0.000001)
             return true;
        else return false;
    }
    double Power(double base, int exponent) {
        if(equal(base,0.0)&&exponent<0)
            return 0.0;
        int absexponent=abs(exponent);
        double result=getpower(base,absexponent);
        if(exponent<0) 
            result=(1.0/result);
        return result;
    
    }
    //優化求冪函式
    double getpower(double b,int e)
    {
        if(e==0) return 1.0;
        if(e==1) return b;
        double result=getpower(b,e>>1);//e左移一位是除以2,求得b的(n/2)次方或者(n-1)/2次方
        result*=result;//b的n次方=b的(n/2)次方 * b的(n/2)次方
                       //或者b的n次方=b的((n-1)/2)次方* b的((n-1)/2)次方 * b
        if((e&1)==1) result*=b; //指數為奇數
        return result;
    }