一、雙指針法
雙指針法的基本思想是,用兩個指針分別指向0和x,然後不斷逼近0的平方根。
def sqrt(x): if x == 0: return 0 l, r = 0, x while l <= r: mid = (l + r) // 2 if mid * mid == x: return mid elif mid * mid < x: l = mid + 1 else: r = mid - 1 return r
代碼解釋:
首先,判斷輸入的x是否為0,如果是則直接返回0。
然後,初始化兩個指針l和r,分別指向0和x。
接著,在while循環中,不斷計算mid(l和r的中間值),然後判斷mid和x之間的關係。
如果mid的平方等於x,說明mid是x的平方根,直接返回mid。
如果mid的平方小於x,說明mid是一個過小的數,需要將l指向mid的右邊一個數。
如果mid的平方大於x,說明mid是一個過大的數,需要將r指向mid的左邊一個數。
最後,當l大於r時,循環結束,返回r,表示0的平方根。
二、牛頓迭代法
牛頓迭代法是一種不斷逼近平方根的方法,在數學上也有較為廣泛的應用。
def sqrt(x): if x == 0: return 0 res = x while res * res > x: res = (res + x // res) // 2 return res
代碼解釋:
首先,判斷輸入的x是否為0,如果是則直接返回0。
然後,初始化res為x。
在while循環中,不斷計算res的平方,與x進行比較。
如果res的平方大於x,說明res是一個過大的數,需要使用牛頓迭代法進行逼近。
在牛頓迭代法中,每次使用res和x/res的平均值來更新res。
最後,當res的平方不再大於x時,循環結束,返回res即可。
三、二分查找法
二分查找法是一種基於有序數組查找指定元素的演算法,可以用於求解0的平方根。
def sqrt(x): if x == 0: return 0 left, right = 1, x while left x: right = mid - 1 elif (mid+1) * (mid+1) <= x: left = mid + 1 else: return mid return 0
代碼解釋:
首先,判斷輸入的x是否為0,如果是則直接返回0。
然後,初始化left為1,right為x。
在while循環中,不斷計算mid(left和right的中間值),然後判斷mid的平方與x之間的關係。
如果mid的平方大於x,說明mid是一個過大的數,需要將right指向mid的左邊一個數。
如果(mid+1)的平方小於等於x,說明(mid+1)是最接近0的平方根的一個數,需要將left指向mid的右邊一個數。
最後,當沒有找到最接近0的平方根的數時,循環結束,返回0。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/300308.html