求乙個非負數的平方根 sqrt實現

2021-06-18 16:47:19 字數 1247 閱讀 2229

學過c或任何一種包含標準庫語言的我們,求解乙個非負數的平方根自然來的容易,隨便呼叫下類似sqrt的函式就一切ok了!比較喜歡**的同學也會好奇不用sqrt怎麼實現求乙個數的平方根,或者說sqrt是如何實現的,這種題目也時常會出現在一些公司的面試中。

本人雖然以前也好奇過,但從未嘗試去查詢資料**一番,今有幸看到一公司的面試題提到,遂總結之以加深印象。

1、最笨也最易想到的或許就是暴力破解法了。

通過設定精度,迴圈測試,以取得在一定精度範圍內的平方根。

for(i=0;fabs(x-i*i)>jingdu;i+=jingdu);  /*這裡jingdu代表允許的精度範圍*/

2、牛頓迭代法

很多時候求乙個方程f(x)=0的精確解並不容易,而有時求出其近似解也有相當的用處。牛頓迭代法求方程f(x)=0的根的過程:初始化乙個x1,通過求f(x)在點(x1,f(x1))處的切線與x軸的交點得x2,然後通過求f(x)在點(x2,f(x2))處的切線與x軸的交點得x3,類似的可能x4,x5,...,xn。當計算次數足夠多時,xn->方程f(x)=0的根。這個過程中有迭代關係式xn=xn-1-f(xn-1)/f(x)在xn-1處的導數。

因此牛頓迭代法求解方程根的思路,我們可以建構函式f(x)=x^2-a=0,從而求得x的平方根。

while (x1!=x0)   /*迴圈條件也可以量實際情況改為在一定精度範圍內*/

同樣有人綜合上述兩種方法提出了求解平方根的演算法,即先用暴力破解法將x1逼近到一定範圍內,再根據牛頓迭代法進行求解,具體**不再贅述。

3、二分法

對於二分法大家都不陌生,見名大多數估計也知求解平方根的思路了。

求解思路分析(以求3的平方根為例):

(0+3/2=1.5,1.5^2=2.25<3;  說明其平方根在[1.5,3]

(1.5+3)/2=2.25,2.25^2=5.0625>3;說明其平方根在[1.5,2.25]

(1.5+2.25)/2=1.875,1.875^2=3.515625>3;說明其平方根在[1.5,1.875]

...進行一定的次數,必然可得到3在一定精度範圍內的平方根。

c**如下:

l=mid=0,r=a;/*初始化*/

while(fabs(lastmid-mid)>jingdu)

4、網上同樣流傳有一神級演算法,本人並未研究,在此貼圖乙份,以供參考。

該演算法的詳細分析見

求乙個數的平方根

求乙個數的平方根的整數部分,二分搜尋方法,若求浮點數,使用牛頓迭代法。計算x2 n的解,令f x x2 n,相當於求解f x 0的解,如左圖所示。首先取x0,如果x0不是解,做乙個經過 x0,f x0 這個點的切線,與x軸的交點為x1。同樣的道理,如果x1不是解,做乙個經過 x1,f x1 這個點的...

起乙個數的平方根 初學平方根

初中數學中,平方根是學生們首先接觸的根式,後面還有立方根,四次方根,五次方根,以及大學要用的n次方根。平方根和立方根是基礎,初中生要能正確理解方根的意義,能夠熟練說出乙個數的方根。今天,我主要想和大家先來認識一下平方根。什麼是平方根呢?這個概念與平方有關,我們知道一一 1 2 1,2 2 4,3 2...

求解乙個數字的平方根,不用平方根庫函式。

思路1 採用 二分 的方式,上界初始化為數字本身,下界初始化為1,這樣用二分,判斷中間數字的平方和目標數字比較,再修改上界和下界,直到小於一定的閾值。思路2 採用牛頓迭代法 數值分析中提到 採用微分的方式,從初始點開始,每次迭代,微分求解切線,然後求解切線和x軸的交點,再以這個交點作為起點,迭代進行...