"Вечный календарь". Установлено: если исследуемая дата лежит в диапазоне от 1582 до 4902 гг., в этом случае номер дня недели (воскресенье имеет номер 0, понедельник - 1, ..., суббота - 6) равен остатку от деления на 7 значения выражения [2.6m-0.2] + d + y + [y/4] + [c/4] - 2c (*),
где d - номер дня в месяце (1, 2,...); m - номер месяца в году, нумерация начинается с марта (март имеет номер 1, апрель - номер 2, ..., декабрь - номер 10, январь и февраль считаются месяцами с номером 11 и 12 предыдущего года); y - две младшие цифры года; c - две старшие цифры года; [x] - означает целую часть числа x.
Вычислить количество пятниц, приходящихся на 13 число ХХ столетия.
Вопросы для обсуждения
Какие понадобятся типы данных?
Какие величины остаются постоянными в процессе работы?
Какие переменные необходимы для решения задачи, каков их тип?
Для вычисления значения выражения (*) необходимо выполнить преобразование типов, для этого воспользуемся функцией trunc, которая преобразует вещественное число в целое путём отбрасывания дробной части числа. Какие значения может принимать данное выражение?
Какие значения принимает функция ord для констант типа месяц?
Решение
Program Example_26; Type month = (january, february, marth, april, may, june, jule, august, september, october, november, december); day = 1..31; year = 1582..4902; week = (sunday, monday, tuesday, wednesday, thursday, friday, saturday); Const h = 20; d : day = 13; d_w : week = friday; Var k : Integer; {для подсчёта количества пятниц} y : year; Mod_y : 0..99; int_y : 15..49; m : month; n : - 50..1000; Begin k:=0; For y:=(h - 1)*100 To h*100 - 1 Do {просмотрим все годы столетия} For m:= marth To february Do {просмотрим все месяцы года} Begin Mod_y:=y Mod 100; {найдём две последние цифры года} int_y:=y Div 100; {найдём две первые цифры года} n := trunc(2.6*(Ord(m)+1)-0.2) + d + Mod_y + trunc(Mod_y/4) + trunc(int_y/4) - 2*int_y; If n Mod 7=Ord(d_w) Then Inc(k); End; Writeln('количество пятниц, приходящихся на ',d,' число в ',h,' столетии равно ',k,'); End.
Итак, в решении этой задачи нам понадобилось выполнить преобразование типов.
Пример 2
Найти k-e простое число в арифметической прогрессии 11, 21, 31, 41, 51, 61,...
Решение
Для решения поставленной задачи необходимо просматривать числа последовательности и проверять каждое из них на свойство простоты. Поскольку нам не известно, сколько членов последовательности необходимо просмотреть, мы должны просматривать этот ряд до тех пор, пока не найдём k-e простое число; для этого воспользуемся циклом с условием.
Program Example_27; Var k : Integer; n, p, d : Longist; Begin Writeln('Введите номер числа'); Readln(k); n:=0; p:=1; While n<k Do Begin Inc(p,10); d:=2; While (p Mod d<>0) And (d<sqrt(p)) Do Inc(d); If d>=sqrt(p) Then Inc(n); End; Writeln(p); Readln; End.
В этом решении мы смогли записать условие d<sqrt(p), так как типы Integer и Real совместимы.