X的平方根的golang實現


實現 int sqrt(int x) 函數。

計算並返回 x 的平方根,其中 x 是非負整數。

由於返回類型是整數,結果只保留整數的部分,小數部分將被舍去。

輸入: 4
輸出: 2
輸入: 8
輸出: 2
說明: 8 的平方根是 2.82842...,由於返回類型是整數,小數部分將被舍去。

首先遇到這種題目肯定要想到使用內置得api來解答:

//使用api來求解
func mySqrt(x int) int {
    f := float64(x)
    ff := math.Sqrt(f)
    return int(ff)
}
其次我們可以使用牛頓法求平方根:

牛頓法:(以本題為例子)

計算平方根,其實就是計算

x^2 =n

的解

令f(x)=x2-n,相當於求解f(x)=0的解,如上圖所示。

首先取x0,如果x0不是解,做一個經過(x0,f(x0))這個點的切線,與x軸的交點為x1。

同樣的道理,如果x1不是解,做一個經過(x1,f(x1))這個點的切線,與x軸的交點為x2。

以此類推。

以這樣的方式得到的xi會無限趨近於f(x)=0的解。

判斷xi是否是f(x)=0的解有兩種方法:

一是直接計算f(xi)的值判斷是否為0,二是判斷前后兩個解xi和xi-1是否無限接近。

經過(xi, f(xi))這個點的切線方程為f(x) = f(xi) + f’(xi)(x - xi),其中f'(x)為f(x)的導數,本題中為2x。令切線方程等於0,即可求出xi+1=xi - f(xi) / f'(xi)。

繼續化簡,xi+1=xi - (xi2 - n) / (2xi) = xi - xi / 2 + n / (2xi) = xi / 2 + n / 2xi = (xi + n/xi) / 2。

迭代公式就已經出來了

x = (x + n/x) / 2

那么代碼:

//使用牛頓法求平方根
func mySqrt1(x int) int {
    res := x
    //牛頓法求平方根
    for res*res > x {
        res = (res + x/res) / 2
    }
    return res
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM