Редактировать 4: для более оптимального подхода проверьте мой другой ответ.Я просто оставляю это здесь, если кто-то хочет попытаться следовать моему мыслительному процессу;)
Редактировать 3: использовать простые числа неправильно, вместо этого используйте наименьший неидеальный квадрат. Пример [35,37]
Редактировать 2: Теперь, когда я думаю об этом, есть еще лучший подход, особенно если вы предполагаете, что num1 и num2 охватывают больший диапазон.
Начните с самого низкого простого числа «Неидеальный квадрат» и рассчитайте максимальный идеальный квадрат, который вписывается в ваш диапазон.
Если вы его нашли, все готово.Если нет, продолжите со следующего простого числа 'неидеальный квадрат'.
В качестве примера, который достаточно хорошо работает для небольших диапазонов:
Я думаю, вы можетеулучшить внешнюю петлю.Нет необходимости проверять каждое число.
Если вы знаете наименьший идеальный квадрат, вы можете просто перейти к следующему идеальному квадрату в последовательности.
Например: [16, 26]
16 -> 4 -> 2 ==> 2 perfect squares
No neeed to test 17 to 24
25 -> 5 ==> 1 perfect square
и так далее ...
@ Chrisvin Jem Ваше предположение неверно, см. Пример выше
Редактировать: Добавлен некоторый код
static int countPerfectSquares(int current) {
int count = 0;
while (true) {
double squareRoot = Math.sqrt(current);
if (isCurrentNumberPerfectSquare(squareRoot)) {
count++;
current = (int) squareRoot;
} else {
return count;
}
}
}
static boolean isCurrentNumberPerfectSquare(double number) {
return ((number - Math.floor(number)) == 0);
}
static int numPerfectSquares(int num1, int num2) {
int max = 0;
if (num1 == 1) {
max = 1;
}
int sqr = Math.max(2, (int) Math.floor(Math.sqrt(num1)));
int current = (int) Math.pow(sqr, 2);
if (current < num1) {
current = (int) Math.pow(++sqr, 2);
}
while (current <= num2) {
max = Math.max(countPerfectSquares(current), max);
current = (int) Math.pow(++sqr, 2);
}
return max;
}