Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用二进制搜索求一个数的平方根_Java_Binary Search_Square Root - Fatal编程技术网

Java 用二进制搜索求一个数的平方根

Java 用二进制搜索求一个数的平方根,java,binary-search,square-root,Java,Binary Search,Square Root,我尝试使用二进制搜索来查找整数的平方根,但是有几个测试用例我无法通过 我能通过mySqrt(4)=2,但我不能通过mySqrt(2147395599) 你知道我把事情搞砸了吗 public static int mySqrt(int x) { int left = 0; int right = x; if(x < 2){ return x; } while(left < righ

我尝试使用二进制搜索来查找整数的平方根,但是有几个测试用例我无法通过

我能通过mySqrt(4)=2,但我不能通过mySqrt(2147395599)

你知道我把事情搞砸了吗

public static int mySqrt(int x) {
        int left = 0;
        int right = x;

        if(x < 2){
            return x;
        }
        while(left < right){
            int mid = left + ((right - left) / 2);

            if(mid * mid == x){
                return mid;

            }
            else if(mid * mid < x){
                left = mid + 1;
            }
            else{
                right = mid; 
            }
        }
        return left - 1;
    }
publicstaticintmysqrt(intx){
int左=0;
int right=x;
if(x<2){
返回x;
}
while(左<右){
int mid=左+((右-左)/2);
if(mid*mid==x){
中途返回;
}
else if(mid*mid
因为mid*mid将溢出。您应该使用long以避免溢出。然后在返回结果时将其强制转换回int

试试这个代码

public static int mySqrt(int x) {
    long left = 0;
    long right = x;

    if(x < 2){
        return x;
    }
    while(left < right){
        long mid = left + ((right - left) / 2);

        if(mid * mid == x){
            return (int)mid;

        }
        else if(mid * mid < x){
            left = mid + 1;
        }
        else{
            right = mid;
        }
    }
    return (int)(left - 1);
}
publicstaticintmysqrt(intx){
左长=0;
右长=x;
if(x<2){
返回x;
}
while(左<右){
长中=左+((右-左)/2);
if(mid*mid==x){
返回(int)mid;
}
else if(mid*mid
这就像是二进制搜索

下面的代码计算数字的[integer]平方根。如果号码不是 完美平方(没有整数平方根),然后返回-1。它通过连续的 猜猜看。如果n是100,它首先猜测是这样的。太高了?尝试一些低一点的东西-介于1和2之间 等等。它的运行时间是什么

int sqrt(int n) {
        return sqrt_helper(n, 1, n);
    }
     int sqrt_helper(int n, int min, int max) {
     if (max < min) return -1; // no square root
     int guess = (min + max) / 2·,
  if (guess *guess == n) { // found it!
      return guess;
  }else if (guess * guess < n) { II too low
      return sqrt_helper(n, guess + 1, max); // try higher
  } else { // too high
     return sqrt_helper(n, min, guess - l); //try lower
  }
}
intsqrt(intn){
返回sqrt_助手(n,1,n);
}
int-sqrt\u辅助对象(int-n,int-min,int-max){
if(max

学分:破解编码面试

这是一个处理双打的版本

  • 它是递归的
  • 它计算直到达到给定的精度

你说得对!我忘了考虑溢流的可能性。谢谢事实上,我不明白,我们传递的是整数值,那么mid如何溢出?@piyush172当mid非常大时,例如,当它是整数的最大值时,mid*mid将大于整数的最大值,从而发生溢出。你可以试试
for (int i = 2; i < 10; i++) {
    System.out.println("sqrt("+i+") = " + sqrt(i));
}
sqrt(2) = 1.414213562373095
sqrt(3) = 1.7320508075688772
sqrt(4) = 2.0
sqrt(5) = 2.23606797749979
sqrt(6) = 2.449489742783178
sqrt(7) = 2.6457513110645907
sqrt(8) = 2.82842712474619
sqrt(9) = 3.0

public static double sqrt(double i) {
    return bsqrt(i, 0, i, 0);
}

static double prec = 10E-200;   

private static double abs(double d)  {
    return d < 0 ? -d : d;
}

private static double bsqrt(double i, double low, double high,
        double last) {
    double mid = (high + low) / 2;
    double d = last - mid;
    if (d < 0) {
        d = -d;
    }
    if (d < prec) {
        return mid;
    }
    double sqr = mid * mid;
    if (sqr < i) {
        return bsqrt(i, mid, high, mid);
    } else {
        return bsqrt(i, low, mid, mid);
    }
}
static double prec = 10E-15;
public static double newtons(double i) {
    // initial guess
    double x = i / 2;

    double d = i;
    double nx = 0;
    while (abs(d) > prec) {
        nx = x - (x*x - i)/(2*x);
        d = nx - x;
        x = nx;
    }
    return nx;
}