x的平方根

2021-10-09 22:57:26 字數 2811 閱讀 7839

實現 int sqrt(int x) 函式。

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

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

示例 1:

輸入: 4

輸出: 2

示例 2:

輸入: 8

輸出: 2

說明: 8 的平方根是 2.82842…, 由於返回型別是整數,小數部分將被捨去。

「袖珍計算器演算法」是一種用指數函式 exp 和對數函式 ln 代替平方根函式的方法。我們通過有限的可以使用的數學函式,得到我們想要計算的結果。

注意: 由於計算機無法儲存浮點數的精確值(浮點數的儲存方法可以參考 ieee 754,這裡不再贅述),而指數函式和對數函式的引數和返回值均為浮點數,因此運算過程中會存在誤差。例如當 x = 2147395600 時,e^(1/2)lnx

的計算結果與正確值 4634046340 相差 10^(−11),這樣在對結果取整數部分時,會得到 4633946339 這個錯誤的結果。

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

class

solution

int ans =

exp(

0.5*

log(x));

return((

long

long

)(ans +1)

*(ans +1)

<= x ? ans +

1: ans);}

};

時間複雜度:o(1),由於內建的 exp 函式與 log 函式一般都很快,我們在這裡將其複雜度視為 o(1)。

空間複雜度:o(1)。

由於 x 平方根的整數部分 ans 是滿足 k^2 ≤x 的最大 k 值,因此我們可以對 k進行二分查詢,從而得到答案。

二分查詢的下界為 0,上界可以粗略地設定為 x。在二分查詢的每一步中,我們只需要比較中間元素 mid 的平方與 x 的大小關係,並通過比較的結果調整上下界的範圍。由於我們所有的運算都是整數運算,不會存在誤差,因此在得到最終的答案 ans 後,也就不需要再去嘗試 ans+1 了。

class

solution

else

}return ans;}}

;

時間複雜度:o(\log x)o(logx),即為二分查詢需要的次數。

空間複雜度:o(1)o(1)。

思路

牛頓迭代法是一種可以用來快速求解函式零點的方法。

為了敘述方便,我們用 c 表示待求出平方根的那個整數。顯然,c 的平方根就是函式

y = f(x) = x^2 - c

的零點。

牛頓迭代法的本質是借助泰勒級數,從初始值開始快速向零點逼近。我們任取乙個 x0作為初始值,在每一步的迭代中,我們找到函式影象上的點 (xi,f(xi)),過該點作一條斜率為該點導數 f′(xi) 的直線,與橫軸的交點記為 xi+1。xi+1

相較於 xi 而言距離零點更近。在經過多次迭代後,我們就可以得到乙個距離零點非常接近的交點。下圖給出了從 x0 開始迭代兩次,得到 x1 和 x2 的過程。

演算法

我們選擇 x0=c 作為初始值。

在每一步迭代中,我們通過當前的交點 xi,找到函式影象上的點 (xi,xi^2−c),作一條斜率為 f′(xi)=2xi 的直線,直線的方程為:

與橫軸的交點為方程 2xix−(xi2+c)=0 的解,即為新的迭代結果 xi+1:

在進行 k 次迭代後,xk 的值與真實的零點 c^(1/2) 足夠接近,即可作為答案。

細節

為什麼選擇 x0=c 作為初始值?

迭代到何時才算結束?

每一次迭代後,我們都會距離零點更進一步,所以當相鄰兩次迭代得到的交點非常接近時,我們就可以斷定,此時的結果已經足夠我們得到答案了。一般來說,可以判斷相鄰兩次迭代的結果的差值是否小於乙個極小的非負數 ϵ,其中 ϵ 一般可以取 10^-6 或 10 ^−7。

如何通過迭代得到的近似零點得出最終的答案?

真正的零點為 n − 1/2ϵ,其中 n 是乙個正整數,而我們迭代得到的結果為 n+1/2ϵ。在對結果保留整數部分後得到 n,但正確的結果為 n−1。

class

solution

double c = x, x0 = x;

while

(true

) x0 = xi;

}return

int(x0);}

};

時間複雜度:o(logx),此方法是二次收斂的,相較於二分查詢更快。

空間複雜度:o(1)。

x的平方根

題目三十九 實現int sqrt int x 函式,計算並返回 x 的平方根。您在真實的面試中是否遇到過這個題?yes 樣例sqrt 3 1 sqrt 4 2 sqrt 5 2 sqrt 10 3 挑戰 o log x class solution if i ix return i if i i x...

x的平方根

實現 int sqrt int x 函式。計算並返回 x 的平方根,其中 x 是非負整數。看到這個題,當時想到了利用二分法,查詢x的平方根。寫出了如下 public int mysqrt int x else if m m x m m 0 else return l 但是這個方法並不適用大數,因為m...

69 x的平方根

一 題目 實現int sqrt int x 函式。計算並返回 x 的平方根,其中 x 是非負整數。由於返回型別是整數,結果只保留整數的部分,小數部分將被捨去。示例 1 輸入 4輸出 2示例 2 輸入 8輸出 2說明 8 的平方根是 2.82842.由於返回型別是整數,小數部分將被捨去。二 思路 採用...