題69.x 的平方根

實現 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=e21​lnx

這樣我們就可以得到 x​ 的值了。

注意: 由於計算機無法存儲浮點數的精確值(浮點數的存儲方法可以參考 IEEE 754,這裏不再贅述),而指數函數和對數函數的參數和返回值均爲浮點數,因此運算過程中會存在誤差。例如當 x=2147395600 時,e21​lnx 的計算結果與正確值 46340 相差 10−11,這樣在對結果取整數部分時,會得到 46339 這個錯誤的結果。

因此在得到結果的整數部分 ans 後,我們應當找出 ans 與 ans+1 中哪一個是

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