public class Main {
private static final double TOLERANCE = 1e-10;
public int mySqrt(int x) {
if (x < 2)
return x;
double lowerBound = 0.0, upperBound = x, midPoint = 0.0;
while (upperBound - lowerBound >= TOLERANCE) {
midPoint = lowerBound + (upperBound - lowerBound) / 2;
double square
= Math.
pow(midPoint,
2); if (Double.
compare(square, x
) < 0) lowerBound = midPoint;
else if (Double.
compare(square, x
) > 0) upperBound = midPoint;
else
return (int) midPoint;
}
return (int) midPoint;
}
public static void main
(final String[] args
){ final Main main = new Main();
final int[] tests = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 24, 25, 26};
for(final int test: tests){
System.
out.
format("Floor sqrt(%d) = %d%n", test, main.
mySqrt(test
)); }
}
}
cHVibGljIGNsYXNzIE1haW4gewoJcHJpdmF0ZSBzdGF0aWMgZmluYWwgZG91YmxlIFRPTEVSQU5DRSA9IDFlLTEwOwoJcHVibGljIGludCBteVNxcnQoaW50IHgpIHsKCSAgICBpZiAoeCA8IDIpCgkgICAgICAgIHJldHVybiB4OwoJICAgIGRvdWJsZSBsb3dlckJvdW5kID0gMC4wLCB1cHBlckJvdW5kID0geCwgbWlkUG9pbnQgPSAwLjA7CgkgICAgd2hpbGUgKHVwcGVyQm91bmQgLSBsb3dlckJvdW5kID49IFRPTEVSQU5DRSkgewoJICAgICAgICBtaWRQb2ludCA9IGxvd2VyQm91bmQgKyAodXBwZXJCb3VuZCAtIGxvd2VyQm91bmQpIC8gMjsKCSAgICAgICAgZG91YmxlIHNxdWFyZSA9IE1hdGgucG93KG1pZFBvaW50LCAyKTsKCSAgICAgICAgaWYgKERvdWJsZS5jb21wYXJlKHNxdWFyZSwgeCkgPCAwKQoJICAgICAgICAgICAgbG93ZXJCb3VuZCA9IG1pZFBvaW50OwoJICAgICAgICBlbHNlIGlmIChEb3VibGUuY29tcGFyZShzcXVhcmUsIHgpID4gMCkKCSAgICAgICAgICAgIHVwcGVyQm91bmQgPSBtaWRQb2ludDsKCSAgICAgICAgZWxzZQoJICAgICAgICAgICAgcmV0dXJuIChpbnQpIG1pZFBvaW50OwoJICAgIH0KCSAgICByZXR1cm4gKGludCkgbWlkUG9pbnQ7Cgl9CglwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihmaW5hbCBTdHJpbmdbXSBhcmdzKXsKCQlmaW5hbCBNYWluIG1haW4gPSBuZXcgTWFpbigpOwoJCWZpbmFsIGludFtdIHRlc3RzID0gezEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAyNCwgMjUsIDI2fTsKCQlmb3IoZmluYWwgaW50IHRlc3Q6IHRlc3RzKXsKCQkJU3lzdGVtLm91dC5mb3JtYXQoIkZsb29yIHNxcnQoJWQpID0gJWQlbiIsIHRlc3QsIG1haW4ubXlTcXJ0KHRlc3QpKTsKCQl9Cgl9Cn0=