1. 程式人生 > >劍指Offer--第16題 數值的整數次方

劍指Offer--第16題 數值的整數次方

++ 循環 運算 判斷 api 比較 ron color 感覺

第16題 數值的整數次方

題目:給定一個double類型的浮點數base和int類型的整數exponent。求base的exponent次方。
思路 看到有點懵,第一感覺覺得是不是應該考慮0的0次或者負數情況,還有就是浮點類型沒辦法使用"="號,最後自己以偷懶的方式直接調用Java的API,如果面試題中不讓調用庫函數,那麽基本上這題就是掛了可能。
以上題目描述來自牛客,沒有對使用做限制。真正的劍指offer上有限制條件不得使用庫函數,同時不需要考慮大數問題。

自己的low代碼

public class Solution {
    public double Power(double base, int exponent) {
         return Math.pow(base, exponent);
  }
}

劍指offer思路::需要將所有情況考慮全面:base可為正、0和負,同樣exponent也可以為正、0和負。1、當base為0,exponent為負時,這是一種常見的異常,分為為0異常;2、當exponent為0時;3、expoonent為負;4、考慮運行效率問題;
結果正確,但效率不高的寫法:

public class Solution {
    public double Power(double base, int exponent) {
        if(base==0&&exponent<0) {
            return 0;
        }
        if(exponent==0) { //這樣判斷是合理的;
            return 1;
        }
        
        int ex = exponent;
        if(exponent<0){  //容易忽略;
            ex = -exponent;
        }
        double result = 1;
        for(int i=0;i<ex;i++ ) { //效率不高;
            result *= base;
        }
        if(exponent<0) {
            result=1/result;
        }
        return result;
    
      }
}

問題:除了使用for循環外,還有就是double為0等號的使用,之前一直有一個錯覺就是浮點類型不能使用等號判斷,因為不準確,所以對這種寫法第一反應就是不正確。但是看了看了網上的解釋發現,其實這種寫法有道理的,因為

回復於 2013-11-27 09:55:46 #5 得分:5
首先一個 double 是否為 0,或者其他的數值,是精確的,可以使用== 。
比如 double f = 0; 此時 f 是精確為 0 ,f == 0 為 true。
但是,double 在運算中,由於截尾的原因,總是有誤差的。而此時是否為0,要看你的這個運算的精度要求。
比如運算後,f = 0.001,此時不能簡單去和 e 去比較。

劍指Offer--第16題 數值的整數次方