Для назначения я должен создать метод, используя двоичный поиск, чтобы найти квадратный корень из целого числа, и если он не является квадратным числом, он должен возвращать целое число s такое, что s * s < = номер (поэтому для 15 он вернется 3). Код у меня есть для него до сих порДвоичный поиск для квадратного корня [домашняя работа]
public class BinarySearch {
/**
* Integer square root Calculates the integer part of the square root of n,
* i.e. integer s such that s*s <= n and (s+1)*(s+1) > n
* requires n >= 0
*
* @param n number to find the square root of
* @return integer part of its square root
*/
private static int iSqrt(int n) {
int l = 0;
int r = n;
int m = ((l + r + 1)/2);
// loop invariant
while (Math.abs(m * m - n) > 0) {
if ((m) * (m) > n) {
r = m;
m = ((l + r + 1)/2);
} else {
l = m;
m = ((l + r + 1)/2);
}
}
return m;
}
public static void main(String[] args) {
//gets stuck
System.out.println(iSqrt(15));
//calculates correctly
System.out.println(iSqrt(16));
}
}
И это возвращает правильный номер для квадратных чисел, но получает палку в бесконечном цикле для других чисел. Я знаю, что проблема заключается в условии while, но я не могу понять, что из-за разрыва между квадратными цифрами становится намного больше, поскольку числа становятся больше (поэтому я не могу просто сказать, что разрыв должен быть ниже порог). Это упражнение касается инвариантов, если это помогает вообще (поэтому почему оно настроено таким образом). Спасибо.
проблема с использованием только int's заключается в том, что ошибка marge, которая вам понадобится в алгоритме, становится все больше и больше с номером, который вы хотите знать из квадратного корня. –