Назовём нетривиальным делителем натурального числа его делитель, не равный единице и самому числу. Например, у числа 6 есть два нетривиальных делителя: 2 и 3. Найдите все натуральные числа, принадлежащие отрезку [123456789; 223456789] и имеющие ровно три нетривиальных делителя. Для каждого найденного числа запишите в ответе его наибольший нетривиальный делитель. Ответы расположите в порядке возрастания.
Например, в диапазоне [5; 16] ровно три различных натуральных делителя имеет число 16, поэтому для этого диапазона вывод на экране должна содержать следующие значения: 16 8
Решение
Введение в суть проблемы
В некоторых хороших книгах по разработке пишут, что код должен быть простой и понятный. А значит задача должна разбиваться на маленькие подзадачи, каждую из которых выполняет свой отдельный метод/функция/процедура.
И это правильный хороший подход, но иногда он может привести вас к алгоритмической ошибке, точнее завести вашу программу в узкое место. В результате код может быть понятный, но настолько медленный, что бесполезный.
ПРОШЕЛ ВСЮ GTA SAN ANDREAS БЕЗ МИССИЙ ЗА 2 МИНУТЫ! СПИДРАН ГТА САН АНДРЕАС БЕЗ МИССИЙ ЗА 2 МИНУТЫ
Давайте рассмотрим как это получается на практике. Вернемся к нашей задаче. Нам нужно выписать все числа, имеющие ровно 3 делителя, из заданного диапазона, при этом с каждым числом написать его максимальный делитель.
Наивный алгоритм
1. Написать функцию для нахождения количества всех делителей.
2. Написать функцию для нахождения максимального делителя.
3. Написать функцию, которая пройдется по всем числам диапазона и в зависимости от количества делителей, если оно равном трем, будет выдавать текущее число и его максимальный делитель.
Замечания к наивному алгоритму
1. Функция, делающая полный перебор всех чисел от 2 до x — 1, чтобы найти количество делителей числа x не оптимальна. Так как у каждого делителя есть своя пара, то пройтись можно до округленного (или до целой части) корня из числа x. Это уже сократит количество инструкций.
Здесь стоит заметить, что у чисел, которые являются квадратами, т. е. корень из которых дает целое число, имеется нечетное количество делителей, потому что два делителя около середины числа вырождаются в один, который совпадает с корнем числа. А у чисел, которые квадратами не являются, всегда четное количество делителей.
Источник: dzen.ru
Найдите минимальное число без использования условного оператора или тернарного оператора
Имея два целых числа, найдите минимальное число между ними без использования условного оператора (или тернарного оператора).
Подход 1
Алгоритм поиска последовательности выпадения числа. Возможно ли такое реализовать?
Дана задача.
1. Есть диапазон чисел от 1 до 100.
2. В определенное (неизвестное) время, выпадает одно из чисел.
3. Снова проходит (неизвестное) количество времени, и выпадает одно из чисел.
4. и т.д.
WOT Лайфхак — получаем об279 не выполняя ЛБЗ !
Числа и время, НЕ случайны. Есть определенная последовательность.
Вопрос: Можно ли написать алгоритм, который исходя из времени и выпавшего числа, пытался бы найти эту последовательность. И «угадать» какое число, и через какой промежуток времени выпадет следующим. Например показывало бы, что это число может выпасть с вероятностью в 40% и чем больше данных (выпавших чисел), тем прогноз точнее. Пока не определится 100% вероятность.
Не прошу написать такой алгоритм, интересует возможно ли вообще теоретически такое написать ?
Спасибо.
- Вопрос задан более трёх лет назад
- 7724 просмотра
Источник: qna.habr.com