實現 int sqrt(int x) 函數。
計算並返回 x 的平方根,其中 x 是非負整數。
由於返回類型是整數,結果只保留整數的部分,小數部分將被捨去。
示例 1:
輸入: 4
輸出: 2
示例 2:
輸入: 8
輸出: 2
說明: 8 的平方根是 2.82842..., 由於返回類型是整數,小數部分將被捨去。
前言
本題是一道常見的面試題,面試官一般會要求面試者在不使用 x 函數的情況下,得到 x 的平方根的整數部分。一般的思路會有以下幾種:
- 通過其它的數學函數代替平方根函數得到精確結果,取整數部分作爲答案;
- 通過數學方法得到近似結果,直接作爲答案。
方法一:袖珍計算器算法
「袖珍計算器算法」是一種用指數函數 exp 和對數函數 ln 代替平方根函數的方法。我們通過有限的可以使用的數學函數,得到我們想要計算的結果。
我們將 x 寫成冪的形式 x1/2,再使用自然對數 e 進行換底,即可得到
x=x1/2=(elnx)1/2=e21lnx
這樣我們就可以得到 x 的值了。
注意: 由於計算機無法存儲浮點數的精確值(浮點數的存儲方法可以參考 IEEE 754,這裏不再贅述),而指數函數和對數函數的參數和返回值均爲浮點數,因此運算過程中會存在誤差。例如當 x=2147395600 時,e21lnx 的計算結果與正確值 46340 相差 10−11,這樣在對結果取整數部分時,會得到 46339 這個錯誤的結果。
因此在得到結果的整數部分 ans 後,我們應當找出 ans 與 ans+1 中哪一個是