Нужно понять, простое ли число или нет
[https://www.codewars.com/kata/5262119038c0985a5b00029f/train/java]
public static boolean isPrime(int num) {
if (num < 2) return false;
int divisorsCount = 2;
for (int i = 2; i < num; i++) {
if (num % i == 0) {
divisorsCount++;
}
}
return (divisorsCount == 2);
}
::: Execution Timed Out (16000 ms) :::
Java
Говорит, что программа слишком долго выполняется. Как её ускорить?
Самое простое, это покидать цикл, когда находится больше 2 делителей
public static boolean isPrime(int num) {
if (num < 2) { return false; }
if (num % 2 == 0) { return num == 2; }
for (int i = 3; i * i <= num; i += 2) {
if (num % i == 0) { return false; }
}
return true;
}
if (num < 2) { return false; }
if (num % 2 == 0) { return num == 2; }
for (int i = 3; i * i <= num; i += 2) {
if (num % i == 0) { return false; }
}
return true;
}
Владимир Дершень
Я понял, что цикл исключает чётные числа, но почему сразу нужно проверять на i²? Это как работает? Не может быть, что в пределах этого, может скрыться ещё одно число? Можете объяснить этот момент?
Аркадий, уж сколько раз эта задача решена за 30 лет по-вашему? Неужели трудно нагуглить оптимизированные решения?
Простые числа - только нечетные (кроме 2). Если четное - сразу нет. Если нечетное - пробегать не по КАЖДОМУ числу от 2 до num, а через одно, только по нечетным делителям.
Опять же цикл < num, если num не захватывает, откуда вы получите 2 делителя? В конце вы определяете простоту по 2 делителям. Будет 1. У вас простые числа будут непростыми.
Дальше, нет смысла бегать до самого числа num, т. к. самый большой делитель (кроме самого числа) не может превышать квадратного корня из num + 1. По этой планке надо ограничить цикл.
Еще можно проверять не все нечетные делители, а только простые, еще больше ограничив цикл.
Отсюда и овертайм у вас.
https://hd01.ru/info/kak-opredelit-prostoe-chislo-ili-net/
Простые числа - только нечетные (кроме 2). Если четное - сразу нет. Если нечетное - пробегать не по КАЖДОМУ числу от 2 до num, а через одно, только по нечетным делителям.
Опять же цикл < num, если num не захватывает, откуда вы получите 2 делителя? В конце вы определяете простоту по 2 делителям. Будет 1. У вас простые числа будут непростыми.
Дальше, нет смысла бегать до самого числа num, т. к. самый большой делитель (кроме самого числа) не может превышать квадратного корня из num + 1. По этой планке надо ограничить цикл.
Еще можно проверять не все нечетные делители, а только простые, еще больше ограничив цикл.
Отсюда и овертайм у вас.
https://hd01.ru/info/kak-opredelit-prostoe-chislo-ili-net/
Ну разумеется! Для codewars нужно ведь что-то побыстрее!. Классический метод Фибоначчи, его модификация с ужè готовым списком primes (получаемым, естественно, безо всякого сита Эратосфена !) и метод теста на составность П. Ферма - это всё глубокая древность. Так, например, Леонардо жил в двенадцатом-тринадцатом веках, Пьер во времена неистового гастонца Д'Артаньяна, испанки Анны Австрийской и кардинала Ришельё.. Да, много воды утекло с тех пор!
。◕‿◕。
。◕‿◕。
Леша Сапкалов
С самого начала, Миша! Нету жизни! Потому что ты говоришь о программе.
Похожие вопросы
- Работа со строками Java Разработать программу, которая вводит строку и находит все слова указанной длины n (n вводится).
- Составь программу в зависимости величины даны чисел матрица количество положительных и отрицательных элементов
- Хочу написать программу -калькулятор .Через какой язык мне нужно писать ?/И как вообще писать ?
- Можно ли создать такую программу?
- Люди, помогите пожалуйста с программой!!!
- Помогите написать java программу нахождения максимального числа из 4-х
- Подскажите пожалуйста, как в данном коде Java сделать так, чтоб при нажатии цифры 3 программа завершала свою работу?
- Помогите разобрать программу java
- Написать программу на языке java
- От junior программистов требуют слишком много знаний?
public static boolean isPrime(int num) {
if (num < 2) return false;
int divisorsCount = 2;
for (int i = 2; i < num; i++) {
if (num % i == 0) {
divisorsCount++;
}
divisorsCount > 2? break : continue;
}
return (divisorsCount == 2);
}