面試題 11

1 題目描述

題目:實現函數 double Power(double base,int exponent),求exponent 次方,不得使用庫函數,同時不考慮大數問題。


算法描述

base^exponent
一般情況 base>=0 exponent>=0
特殊情況 base=0 exponent<0 此時計算需要進行 /0 操作,導致錯誤
特殊情況 base=0 exponent=0,0^0 在數學上沒有意義,可以返回 0 或者 1


C 語言實現

#include<stdio.h>
int invalidInput=0;
int equal(double base){
    if(base-0.0>-0.0000001&&base-0.0<0.0000001){
        return 1;
    }else{
        return 0;
    }
}
double powerWithUnsignedExponent(double base,int exponent){
    if(exponent==1) return base;
    if(exponent==0) return 1;
    double result=powerWithUnsignedExponent(base,exponent>>1);
    result=result*result;
    if(exponent&1==1){
       result*=base;
    }
    return result;
}
double Power(double base,int exponent){
    double result=0.0;
    if(equal(base)&&exponent<0){
        invalidInput=1;
        return result;
    }
    unsigned int absExponent=(unsigned int)exponent;
    if(exponent<0){
        absExponent = (unsigned int)(-exponent);
    }
    result=powerWithUnsignedExponent(base,absExponent);
    if(exponent<0){
        result=1/result;
    }
    return result;
}

void main(){
    printf("%f  ",Power(2,3));
    printf("%d\n",invalidInput);

    printf("%f  ",Power(2,-3));
    printf("%d\n",invalidInput);

    printf("%f  ",Power(0,-3));
    printf("%d\n",invalidInput);

    printf("%f  ",Power(0,0));
    printf("%d\n",invalidInput);
}

注意事項

1 代碼完成性:功能測試、邊界測試、負面測試
2 處理錯誤的三種方法,通常有 3 種方式將錯誤信息傳遞給調用者,函數返回值,設置全局變量和拋出異常。每一種方法都有侷限,本例中使用全局變量記錄錯誤信息。
3 使用移位操作代替 *2 操作,使用 &1 代替 奇偶數判定 操作,效率會更高。

a^n = a^(n/2) * a^(n/2)         n爲偶數
a^n = a^(n-1/2) * a^(n-1/2)*a   n爲奇數

4 用遞歸的方式可以實現 O(lgn) 時間複雜度求解 a^n。
5 由於計算機表示小數都有誤差,不能直接使用等號判斷兩個小數是否相等,如果兩個小數的差的絕對值很小,比如小於0.0000001,就可以認爲他們相等。

發佈了48 篇原創文章 · 獲贊 2 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章