劍指Offer--第16題 數值的整數次方
阿新 • • 發佈:2018-07-09
++ 循環 運算 判斷 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題 數值的整數次方