Песни о Паскале - [77]

Шрифт
Интервал

>      if S*SA <> [] then R:= R + [State];

>      end;

>      WriteCharSet(FileOut, R); Readln; { вывод результата }

>      Close(FileIn); Close(FileOut);

>end.


Программа Ника вычислила, что царство «A» соседствует с царствами «B», «D», «F», «I». Со временем проверка на местности это подтвердила.

Царь щедро наградил программиста, но история на этом не закончилась. О великом научном успехе скоро знала и последняя собака на материке. Но больше других этот успех заинтересовал купцов, плативших пошлины при пересечении границ. Они явились к Нику с предложением, от которого тот не смог отказаться. Хотите продолжения сказки? – оно ждёт вас в главах 49, 57 и 58.

Решето Эратосфена

Древние греки не знали, что они древние. И компьютеров тоже не знали, зато дышали бодрящим морским воздухом, коротая досуг в философских и математических размышлениях. Греческий досуг оказался не таким уж пустым, – иные задачки, придуманные под ласковый шепот волн, не решены по сию пору! Одна из них – вычисление простых чисел.

Прежде всего, выясним, что это за числа? Простым называют число, которое делится без остатка лишь на само себя и единицу. Все прочие числа являются составными. Возьмем, к примеру, числа от 1 до 10 и выделим среди них составные.


>1 2 3 4 5 6 7 8 9 10


Здесь отмечены составные числа 4, 6, 8, 9 и 10, – они делятся без остатка либо на 2, либо на 3. Оставшиеся числа 1, 2, 3, 5 и 7 являются простыми.

Кто-то из греков задался вопросом: можно ли вычислить очередное простое число, если известны все предыдущие? Например, исходя из того, что числа 1, 2, 3 и 5 простые, определить следующее простое число (7). Как ни мудрили мудрецы, такой формулы или алгоритма пока не придумали! Но усилия в этом направлении породили целые отрасли математики, – вот такой полезный неуспех!

Размышлял над задачей и грек Эратосфен. Он тоже не решил её, однако нашел остроумный способ отсеивать простые числа, не превышающие некоторого числа N. Вот суть его идеи.

Положим, мы ищем простые числа не превышающие 20. Выпишем на морском песочке в ряд числа с 1 до 20. Первые два числа – 1 и 2 – простые, их не тронем, а среди остальных сотрем каждое второе, то есть 4, 6, 8 и так далее.

Затем находим первое нестертое число – это три. Сотрем каждое третье после тройки: 6, 9, 12, 15 и 18 (хотя часть из них уже стерта, лишний раз это сделать не повредит). Повторяя процедуру, находим следующее нестертое число – это пять. Стираем каждое пятое после пятерки: 10, 15, 20 (хотя все они уже стерты). Достигнув середины этого списка – числа 11, остановимся. Дальше двигаться нет смысла, поскольку на песке остались лишь простые числа.

Примечание. Если говорить точнее, лучше остановиться на числе, которое составляет корень квадратный из числа N, в данном случае это 5. Но для упрощения задачи мы будем обрабатывать больше чисел – половину ряда.

Вот результат этой пляжной математики, где стираемые числа выделены, а стертые обозначены звездочками. Здесь хватило всего двух просевов.


>1-й отсев чисел, кратных 2:

>1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

>2-й отсев чисел, кратных 3:

>1 2 3 * 5 * 7 * 9 * 11 * 13 * 15 * 17 * 19 *

>Результат – простые числа:

>1 2 3 * 5 * 7 * * * 11 * 13 * * * 17 * 19 *


А если бы Эратосфен жил в наше время? Стал бы он царапать на песке? Конечно, нет, – на что ж тогда компьютеры? Программа «P_38_4» находит все простые числа, не превышающие 255, – роль песка исполняет множество чисел.


>program P_38_4; { Решето Эратосфена }

>var Simples : set of byte; { множество чисел }

>n, m : integer;

>F : text;

>begin

>Assign(F, 'P_38_4.out'); Rewrite(F);

>Simples:= [2..255]; { Сначала множество полное }

>{ Цикл вычеркивания составных чисел }

>for n:=2 to (255 div 2) do begin

>      { если число ещё не вычеркнуто }

>      if n in Simples then

>      { проверяем на кратность ему все последующие }

>      for m:=2*n to 255 do

>      { если остаток(m/n) равен нулю, то m – составное }

>      if (m mod n)=0

>      { и его надо вычеркнуть из множества}

>      then Simples:= Simples – [m];

>end;

>{ Распечатка множества простых чисел }

>for n:=2 to 255 do if n in Simples then Writeln(F,n);

>Close(F); Readln;

>end.


Мелочь, а приятно

Одну из первых своих программ мы снабдили разумом попугая, научив повторять имя пользователя. После ввода имени в переменную S программа печатала.


>      Writeln (’Здравствуй, ’+ S);


Сделаем её чуть умнее, научив отличать мальчиков от девочек. По крайней мере, для русских имен. Русские женские имена оканчиваются на буквы «а» или «я» (Анна, Светлана, Мария и так далее), чего не скажешь о мужских. Последнюю букву имени можно «выдернуть» в символьную переменную C таким оператором.


>      C:= S[Length(S)];


И теперь приветствовать пользователя можно так:


>      if (C=’А’) or (C=’а’) or (C=’Я’) or (C=’я’)

>      then Writeln (’Здравствуй, девочка ’+ S)

>      else Writeln (’Здравствуй, мальчик ’+ S);


Здесь проверяется совпадение переменной C с буквами верхнего и нижнего регистров, поскольку нельзя предсказать, в каком регистре будет введено имя. Условный оператор выглядит громоздко, но, призвав на помощь множество, мы упростим его.


>      if C in [’А’, ’а’, ’Я’, ’я’]


Рекомендуем почитать
Проект Королева

Лианка попадает в мир, который не отличался бы от нашего, если бы не драконы. Давняя война разрушила традиционный уклад. Человечество выбрало путь технического прогресса. Драконы одичали настолько, что прямоходящие собратья забыли о прежней дружбе и начали считать ящеров животными, притеснять и отлавливать для опытов и зоопарков. Крылатые обречены. Они отступают все выше в горы, но люди жадные до знаний и земель беспощадны.В первый же день Лианка, угодив в сети ловцов, оказывается в огромной клетке вместе с другими драконами.


Там, где холод и ветер

Мы не меняемся. Мы просто становимся сами собой. Мы теряем, чтобы найти и расстаемся, чтобы встретиться.  ...Спустя несколько лет отсутствия, Хейз возвращается в родной город, желая забыть то, что не сложилось и начать строить жизнь заново. Все идет по плану, пока на пороге ее квартиры не появляется он. От автора: Вдохновение черпалось в кельтской мифологии, из которой взяты небольшие фрагменты. Все остальное - плоды фантазии автора) На достоверность описаний мест действия и прочих специфических моментов не претендую.


Дорога снов

В застывшем воздухе — дымы пожарищ. Бреду по раскисшей дороге. Здесь до меня прошли мириады ног. И после будут идти — литься нескончаемым потоком… Рядом жадно чавкает грязь. — тоже кто-то идет. И кажется не один. Если так, то мне остается только позавидовать счастливому попутчику. Ибо неизбывное одиночество сжигает мою душу и нет сил противостоять этому пламени.Ненависть повисла над дорогой, обнажая гнилые, побуревшие от крови клыки. Безысходность… Я не могу идти дальше, я обессилел. Но… все-таки иду. Ибо в движении — жизнь.


Зверь

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Он идет за мной

Главная героиня юная карьеристка, Татьяна Лунева, живет в своем неприметном городе, работает на не приметной работе и мечтает об отпуске. В один из июльских вечеров в ее жизнь врывается незнакомец. Он представляется как убийца теней и увозит ее в свой мир, что бы защитить от темных душ, охотившихся за ней. Вскоре Татьяна узнает, что она не просто человек, и что отныне ей придётся бороться за свою жизнь и свободу. Читайте захватывающие приключения юной девушки в мире призраков. И узнайте, каково быть человеком с серебреной душой.


Зеркала

Неожиданно подобранный с улицы кот может оказаться вовсе и не котом, а ещё выясняется, что зеркала способны перенести человека в совершенно иной мир. Благодаря тому самому не-коту, конечно же.