Статья Автор: Лебедев Дмитрий Алексеевич

Проблема L. Найди простое число на отрезке по его номеру

Проблема L. Найди на отрезке простое число по его номеру.

Дан отрезок [A;B] и число K. Надо среди всех простых чисел, принадлежащих отрезку,  найти K-е простое число..
Входные умения: умение развернуть "решето Эратосфена", проверка на простоту с помощью "поиска минимального делителя числа" (программа min_del)
Задание:
написать программу, которая среди всех простых чисел отрезка находит К-е простое число
При подготовке тестов, считалось, что ученик может применить "неоптимальный" способ решения. На этом способе и тестировалась программа.
В каждом способе, вначале развертывалось "решето Эратосфена", а затем выполнялся поиск нужного числа.
Способ 1  Создать список из всех простых чисел отрезка, а затем выбрать нужное. На Python это можно сделать через срезы
Способ 2. Перебрать все числа отрезка в "решете"  до подля каждого определить "простое оно или нет"
Программу sieve(A,B) для разветки решета скроем, отрезок зададим фиксированный, а номер числа будем вводить



Способ 2 должен быть в целом лучше Способа 1 (нет лишних затрат памяти, перебераем меньше и т.п.), 
но реальная ситуация интереснее
К из 1_018_852 Способ 1(с) Способ 2 (с)
500_000 ~720 ~1000
600_000 ~900 ~0.84
700_000 ~1.0 ~0.94
800_000 ~1'0 ~1.09
900_000 ~1.0 ~1.18
1_000_000 ~1.0 ~1.4
1_100_000 ~1.0 ~1.6
Возможно, результаты зависят от конкретной "песочницы", но получается, что 
  • иногда, решение "оптимальное" (способ 2) оказывается менее эффеквным "неоптимального" (способ 1)
  • "проще" дать более общее решение, а не "гоняться за мнимой эффективностью"
Для решения задачи предложим следующее решение.

Печать