25. Проверить число на простоту
Условие задачи:
Необходимо написать консольное приложение, которое считывает целое число и определяет, является ли оно простым.
Простое число — это натуральное число больше 1, которое делится без остатка только на 1 и на само себя.
Код:
public class PrimeChecker {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int number = scanner.nextInt();
if (isPrime(number)) {
System.out.println(number + " — простое число.");
} else {
System.out.println(number + " — не является простым.");
}
scanner.close();
}
public static boolean isPrime(int n) {
// ваш код
}
}
Примеры:
2 → простое число
4 → не является простым
17 → простое число
Спойлеры к решению
Подсказки
n <= 1 не являются простыми.💡
2 — единственное чётное простое число.💡 После проверки на чётность достаточно рассматривать только нечётные делители.
💡 Проверять делители достаточно до квадратного корня из
n.💡 При обнаружении первого делителя можно сразу вернуть
false.Решение
public static boolean isPrime(int n) {
if (n <= 1) {
return false;
}
if (n == 2) {
return true;
}
if (n % 2 == 0) {
return false;
}
for (int divisor = 3; divisor <= n / divisor; divisor += 2) {
if (n % divisor == 0) {
return false;
}
}
return true;
}
Сначала исключаются числа, которые по определению не могут быть простыми:
if (n <= 1) {
return false;
}
Число 2 обрабатывается отдельно:
if (n == 2) {
return true;
}
После этого можно исключить все остальные чётные числа:
if (n % 2 == 0) {
return false;
}
Далее проверяются только нечётные делители:
for (int divisor = 3; divisor <= n / divisor; divisor += 2)
Условие:
divisor <= n / divisor
эквивалентно проверке до √n, но не требует вычисления Math.sqrt() и избегает потенциального переполнения выражения divisor * divisor.
Если найден делитель:
if (n % divisor == 0) {
return false;
}
число является составным.
Например, для 17 проверяются делители:
3
Ни один из них не делит 17 без остатка, поэтому результат — true.
Временная сложность — O(√n), дополнительная память — O(1).