我已经编写了这个函数来查找两个数字(包括两个)之间的平方根数。
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()
函数
答案 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平方)介于x2
和lo
之间时递增hi
,并在x2
和hi
之间终止循环{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;
}