面試題 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
的原因。