автор: Горский С.С.
Мне бы хотелось рассмотреть решение задач
основной части Дистанционной обучающей
олимпиады, частью которой является наш проект.
Решения, реализованные на Лого. Вообще, в период
подготовки Лого-секции А.Г Юдиной высказывалась
мысль, что, проводя отдельную Лого-олимпиаду, мы
как бы подразумеваем, что задачи основной части
невозможно решить на Лого. И тем самым
существенно принижаем возможности и мнение о
Лого. Частично разделяя это утверждение, мне
показалось интересным рассмотреть задачи
основной части на Лого. Что касается нашей
Лого-олимпиады, мне кажется, что она вполне
естественна, т.к. все же возрастной уровень
изучающих лого в целом не очень высок. И наша
олимпиада, к тому же двух уровневая, учитывает
эти реалии. Тем более, что в итоге, среди команд
основной части ни одна не писала на Лого, хотя
язык это в некоторых школах-участниках
изучается, и строго язык программирования
олимпиады не регламентировался.
На сегодня предлагаю вашему вниманию наиболее
простую задачу - наиболее рациональный способ
поиска большого количества простых чисел (речь
идет о числа порядка 100000000). Я уже реализую идеи,
примененные как нашей командой, выступающей в
основной части (на Паскале и Си), так и других
команд, прозвучавших в дальнейшем
обсуждении.(Правда, и числа до 100000000 я не
рассматривал.)
Идеи таковы.
Все найденные числа заносятся в список, и при
проверке на "простоту" числа делители
берутся только из списка. Это позволяет не
проверять делимость на составные числа.
Второе. Простые числа, начиная с 5, должны лежать
на множестве чисел вида 6*к-1 или 6*к+1. Поэтому в
качестве "кандидатов" на простые числа
выбираем только их.
Не берусь утверждать, что это лучший возможные
алгоритм. Хотелось бы отметить, что борясь за
структурность и при отсутствии цикла While do
или Repeat until, имеющихся в Паскале, я
рассмотрел два варианта алгоритма проверки на
делимость конкретного числа. Вариант ДЕЛИМОСТЬ2
в итоге был отметен, хотя он, возможно, более
красив - он использует рекурсию, и помог
добраться до чисел в пределах 14000. Второй, и
окончательный вариант, использует ПОВТОРИ и
принудительный выход.
Если кто-либо предложит еще вариант, будет
здорово.
| это делимость повтори 3 * :к [
] |
это простое пусть "к 1 пусть "прост (список 2 3) покажи "поехали повтори 10000 [
покажи :прост |
| это делимость2 пусть "д :д + 1 пусть "о остаток :ч элемент :д :прост если :о = 0 [пусть "рез 0 ] если (и :рез = 1 (элемент :д :прост) < :ч / 2) [делимость] конец |
P.S. Буду очень рад, если найдутся еще желающие
прорешать задачи основной части на Лого. Если для
этого необходимо переслать задачи остальной
части, пришлите запрос.
С уважением, Горский
Сергей Сергеевич.