Implement int ​​sqrt(int x)​​.

Compute and return the square root of x.


Have you met this question in a real interview? 


Yes


Example


sqrt(3) = 1

sqrt(4) = 2

sqrt(5) = 2

sqrt(10) = 3



1 class Solution {
2 public int mySqrt(int x) {
3 long start = 0, end = x;
4
5 while (start <= end) {
6 long mid = start + (end - start) / 2;
7 if (mid * mid == x) {
8 return (int) mid;
9 } else if (mid * mid < x) {
10 start = mid + 1;
11 } else {
12 end = mid - 1;
13 }
14 }
15 return (int) end; // we are looking for lower end.
16 }
17 }


另一个版本: double sqrt(double x, int precision)



1 double sqrt(double x, int k) {
2 if (x < 0) throw new IllegalArgumentException("The input " + x + " is less than 0.");
3 if (x == 0) return 0;
4 double start = 0;
5 double end = x;
6 while (start <= end) {
7 double mid = (end - start) / 2 + start;
8 double result = mid * mid;
9 if (isWithinLimit(result, x, k)) {
10 return mid;
11 } else if (result > x) {
12 end = mid;
13 } else {
14 start = mid;
15 }
16 }
17 return -1;
18 }
19
20 boolean isWithinLimit(double v1, double v2, int k) {
21 double precision = 1.0 / Math.pow(10, k);
22 if (Math.abs(v1 - v2) <= precision) {
23 return true;
24 }
25 return false;
26 }


 还有就是用牛顿法:​



1 public static double sqr(double c) {
2 if (c < 0) {
3 return Double.NaN;
4 }
5 double err = 1e-15;
6 double x = c;
7 while (Math.abs(x - c / x) > err * x) {
8 x = (c / x + x) / 2.0;
9 }
10 return x;
11 }