---
# System prepended metadata

title: 69. Sqrt(x)
tags: [LeetCode]

---

---
tags: LeetCode
---

# 69. Sqrt(x)

Implement int sqrt(int x).

Compute and return the square root of x, where **x is guaranteed to be a non-negative integer.**

Since the **return type is an integer,** the decimal digits are truncated and only the integer part of the result is returned.

Example 1:    
Input: 4    
Output: 2    

Example 2:    
Input: 8    
Output: 2    
Explanation:     
The square root of 8 is 2.82842..., and since the decimal part is truncated, 2 is returned.

輸入範本如下
```C#
public class Solution {
    public int MySqrt(int x) {
        
    }
}
```

### 直覺想法
用二分搜尋法去逼近答案.


```C#
40 ms	14.8 MB
You are here!
Your runtime beats 83.43 % of csharp submissions.
// 使用二分搜尋
public int MySqrt(int x)
{
    int low = 0, high = x / 2 + 1; // + 1 是為了處理 x = 1 使 high = 0 的 case
    while (low <= high)
    {
        // high + low 的結果可能會導致 Overflow , 使用 long 又必須轉型. 花時間
        int mid = low + (high - low) / 2; 
        long powValue = (long)mid * mid; // 閃不過 , 必須使用 long
        if (powValue == x)
        {
            return mid;
        }
        else if (powValue < x)
        {
            low = mid + 1;
        }
        else
        {
            high = mid - 1;
        }
    }
    // 離開 While (low<=high) 的時候 low 一定大於正確答案且 high 一定小於正確答案. 此題會希望若無解 , 回傳最接近小於正確答案的值 
    return high;
}
```
```C#
// 132 ms	14.7 MB
// 暴力法 , 直接從 0 開始 一個一個 try
public int MySqrt(int x)
{
    int low = 0, high = x / 2 + 1, ans = 0;
    for (; low <= high; low++)
    {
        long powValue = (long)low * low;
        if (powValue == x)
        {
            return low;
        }
        else if (powValue < x)
        {
            ans = low;
        }
        else
        {
            break;
        }
    }
    return ans;
}
```

![](https://i.imgur.com/ozGBmZL.png)
![](https://i.imgur.com/Z4vekYB.png)
![](https://i.imgur.com/cI8tCnY.png)
![](https://i.imgur.com/R6dy30S.png)
![](https://i.imgur.com/jKHrvEb.png)

```C#
36 ms	14.8 MB
You are here!
Your runtime beats 97.11 % of csharp submissions.
// 牛頓法
public int MySqrt(int a)
{
    // 牛頓法公式 , 可以透過 Xn 得到 Xn+1
    // 所以只要目前 Xn 的結果 約等於 Xn * Xn = x + 誤差 , 該 Xn 就是答案了

    const double epsilon = 1e-6; // 誤差精度
    double xn = a;
    while (xn * xn > a + epsilon)
    {
        xn = (xn + a / xn) / 2;
    }
    return (int)xn;
}
```



### 參考資源
[Searching Sorted List](https://www.cs.usfca.edu/~galles/visualization/Search.html)    
[淺談二分搜尋法](https://blog.techbridge.cc/2016/09/24/binary-search-introduction/)
- 1. 保證答案一定在閉區間 [L, R] 裡面
  2. 當這區間剩下的數很少時，改用線性搜尋

[How to Implement Integer Square Root in C/C++?](https://helloacm.com/coding-exercise-implement-integer-square-root-c-online-judge/) 
- 圖的公式是錯的.
    
[怎麼用牛頓法解平方根？](https://www.itread01.com/content/1544934182.html)

[淺談二分搜尋法](https://blog.techbridge.cc/2016/09/24/binary-search-introduction/)






### Thank you! 

You can find me on

- [GitHub](https://github.com/s0920832252)
- [Facebook](https://www.facebook.com/fourtune.chen)

若有謬誤 , 煩請告知 , 新手發帖請多包涵

# :100: :muscle: :tada: :sheep: 
