Решение задач
Пример 1
"Вечный календарь". Установлено: если
исследуемая дата лежит в диапазоне от 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 совместимы.
Решение задач
- Даны натуральные числа, обозначающие
число, месяц и год. Используя условие
примера 1, определить день недели, на
который падает указанная дата.
- День учителя ежегодно отмечается в
первое воскресенье октября. Дано
натуральное число n, обозначающее
номер года. Определить число, на которое
приходится День учителя.
- Рассмотрим некоторое натуральное число.
Если это не палиндром, то изменим порядок
его цифр на обратный и сложим исходное
число с получившимся. Если сумма не
палиндром,то над ней повторяется то же
действие и т.д., пока не получится
палиндром. Даны натуральные числа k, m, l (k<l).
Проверить, верно ли, что для любого
натурального числа из диапазона от k
до l процесс завершается не позднее,
чем после m таких действий.
- Найти 100 первых простых чисел.
- Дано натуральное число n, целые
числа a1, a2,..., an.
Рассмотреть отрезки последовательности a1,
a2,...,an (подпоследовательности
идущих подряд членов), состоящих из
- полных квадратов;
- степеней пятёрки;
- простых чисел.
В каждом случае получить наибольшую из
длин рассматриваемых отрезков.
Содержание