找到两个数字之间的平方根数

时间:2016-04-15 19:10:22

标签: java performance for-loop

我已经编写了这个函数来查找两个数字(包括两个)之间的平方根数。

static int FindRoot(int no1, int no2) {
    int res = 0;
    for (int x = no1; x <= no2; x++) {
        for (int y = 1; y <= no2; y++) {
            if (y * y == x)
                res++;
        }
    }
    return res;
}

这样可以正常工作,但我在考虑它的性能。 因为在这种情况下inner For loop将从起始位置(1)执行,所以如果有人将大量范围传递给方法,则需要时间。

所以,我的问题是:

  

有没有其他方法可以找到更好的表现?

P.S.-我不能使用Math.sqrt()函数

4 个答案:

答案 0 :(得分:3)

static int FindRoot(int no1, int no2) {
    int res = 0;
    int x = 0;

    // Ignore squares less than no1
    while(x*x < no1) {
        x++;
    }

    // Count squares up to and including no2
    while(x*x <= no2) {
        res++;
        x++;
    }

    return res;
}

答案 1 :(得分:2)

通过摆脱外循环

,你可以摆脱单个for循环
static int findRoot(int lo, int hi) {
    int numRoots = 0;

    for (int x = 0, x2 = 0; x2 <= hi; x++, x2 = x * x) {
        if (x2 >= lo) {
            numRoots++;
        }
    }    

    return numRoots;
}

这里有效地执行内循环一次,当numRoots(x平方)介于x2lo之间时递增hi,并在x2hi之间终止循环{1}}大于x(而不是代码中hi大于this时)。

答案 2 :(得分:0)

它也会起作用。

static int FindRoot2(int no1, int no2) {
    int res = 0;
    int inner=1;
    for (int x = no1; x <= no2; x++) {
        for (int y = inner; y <= no2; y++) {
            if (y * y == x)
            {
                inner=y;
                res++;
            }
        }
    }
    return res;
}

在这种情况下,内部循环不会从1开始执行。

答案 3 :(得分:0)

目前的算法效率低下有很多原因,但最大的原因是内部for循环不是必需的。

您正在寻找的算法背后的想法是从高于或等于no1的最低完美平方开始,然后转到下一个完美的正方形,下一个和下一个,跟踪多少你击中,直到你所处的完美广场高于no2。

static int FindRoot(int no1, int no2) {

    int res = 0;
    int x = 1;

    // This loop gets x to the first perfect square greater than
    // or equal to no1
    while( (x * x) < no1 ) {
        x++;
    }

    // This loop adds 1 to res and increases x
    // as long as x^2 is less than or equal to no2
    for(; (x * x) <= no2; x++, res++) { }

    return res;
}