《劍指offer》Java學習錄:面試題 11:數值的整數次方

面試題 11:數值的整數次方

題目

實現函數 double power(double base, int exponent),求base的 exponent次方。不得使用庫函數,同時不需要考慮大數問題。

分析

因爲不用考慮大數問題,所以,這個題看起來很簡單。只需要將base累計乘以exponent次就可以了。如果是這樣的話,你就掉進陷阱了。該題考查的是考慮問題的全面性。power函數,如果輸入小於1,即零和負數時怎麼辦,如果用累乘的方式,就只考慮到整數的情況。

我們知道,當指數爲負數的時候,可以先對指數求絕對值,算出結果後取倒數即是結果。因爲需要求倒數,我們就需要考慮是否有可能對0求倒數,如果有,因此產生的異常如何處理?

需要指出的是,由於0的0次方在數學上是沒有意義的,因此無論是輸出0還是1都是可以接收的,但這都需要和面試官說清楚,表明我們已經考慮到這個邊界值了。

解:java

static boolean isInvalidInput = false;
private static boolean equals(double num1, double num2) {
    return (num1 - num2 > -0.0000001) && (num1 - num2 < 0.00000001);
}

private static int absInt(int num) {
    if (num < 0) {
        num = -num;
    }
    return num;
}

private static double power(double base, int exponent) {
    if (equals(base, 0.0)) {
        isInvalidInput = true; // 表示輸入非法
        return 0.0;
    }
    if (equals(base, 1.0) || exponent == 0) { // 如果底數爲1, 不用算,返回就好
        return 1.0;
    }

    int absExponent = absInt(exponent);
    double result = 1.0d;
    for (int i = 0; i < absExponent; i++) {
        result *= base;
    }
    if (exponent < 0) {
        result = 1.0 / result;
    }
    return result;
}

public static void main(String args[]) {
    System.out.println(power(2, 0));
}

需要注意的是,我們在判斷浮點型數字是否相等時,不能直接這樣判斷base == 0.0,這是因爲在計算機內表示小數時有誤差。判斷兩個小數是否相等,只能判斷它們只差的局對峙是不是在一個很小的範圍內。如果兩個數相差很小,就可以認爲它們相等,這是在代碼中使用自己實現equals的原因。

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