Root /ArchiveAbout
()

Определить номер дня недели

Определить номер дня недели

На этой странице дано решение примеров Integer24 - Integer28 из задачника Абрамяна, в которых рассматривается определение дня недели в году.

Integer24. Дни недели пронумерованы следующим образом: 0 — воскресенье, 1 — понедельник, 2 — вторник, …, 6 — суббота. Дано целое число K, лежащее в диапазоне 1–365. Определить номер дня недели для K-го дня года, если известно, что в этом году 1 января было понедельником.

Дней недели всего 7, и их номера 0, 1, 2, ..., 6. А это значит, что для определения дня недели, с которого начинается K-й день года, достаточно рассмотреть остатки от деления K на 7. Действидельно, если остаток 1, то это – понедельник (дни 1, 8, 15, ...); остаток 2 – вторник (дни 2, 9, 16, ...), ...; остаток 0 – воскресенье (дни 7, 21, 35, ...).

Таким образом, если год начинается с понедельника (1 января), то достаточно взять K mod 7. А если 1 января – вторник? Тогда очевидно, чтобы получить остаток 2 (номер вторника в задаче), нужно до числа K добавить 1, а потом делить на 7: (K+1) mod 7 – первый день года даст 2-й день недели (вторник). Далее, если 1 января – среда, то вычисляем (K+2) mod 7 – первый день года даст 3-й день недели (3 – номер среды). И так далее, если на 1 января приходится N-й день недели (0, 1, 2, ..., 6), то вычисляем (K+N-1) mod 7 – в таком случае при K=1 получим остаток N (первый день под номером N).

В результате мы получим следующее:

Поскольку в задании Integer24 на 1 января приходится все таки понедельник (номер 1), то для определения K-го дня года из вышеприведенного списка берем пункт 1, что и записано в программе ниже.

var
  K: word;

begin
  writeln('1 января - понедельник.');
  write('K = ');
  readln(K); { <-- Вводим K-й день года (1..365) }
  writeln;
  { Поскольку в неделе 7 дней, а 1-й день - понедельник, 
  то номер дня определяем как остаток от деления K на 7: }
  writeln(K, ' дню года соответствует ', K mod 7, ' день недели');
  readln
end.

**type** word;: Представляет 16-битовое целое число без знака.Диапазон значений: 0 .. 65 535

**type** word;: Представляет 16-битовое целое число без знака.Диапазон значений: 0 .. 65 535

Integer25. Дни недели пронумерованы следующим образом: 0 — воскресенье, 1 — понедельник, 2 — вторник, …, 6 — суббота. Дано целое число K, лежащее в диапазоне 1–365. Определить номер дня недели для K-го дня года, если известно, что в этом году 1 января было четвергом.

Поскольку 1 день года начинается с четверга (номер 4 в условии), то из списка выше под номером 4 имеем выражение (K+3) mod 7, которое используем в задаче:

var
  K: word;

begin
  writeln('1 января - четверг.');
  write('K = ');
  readln(K); { <-- Вводим K-й день года (1..365) }
  writeln;
  { Поскольку в неделе 7 дней и понедельник имеет номер 1, то 
  номер дня определяем как остаток от деления на 7. Но так как 
  1-й день недели припадает на четверг, то есть 4-й номер, то 
  все номера дней будут сдвинуты на 3 дня вперед (1 + 3 = 4): }
  writeln(K, ' дню года соответствует ', (K + 3) mod 7, 
  ' день недели');
  readln
end.

**type** word;: Представляет 16-битовое целое число без знака.Диапазон значений: 0 .. 65 535

**type** word;: Представляет 16-битовое целое число без знака.Диапазон значений: 0 .. 65 535

Integer26. Дни недели пронумерованы следующим образом: 1 — понедельник, 2 — вторник, …, 6 — суббота, 7 — воскресенье. Дано целое число K, лежащее в диапазоне 1–365. Определить номер дня недели для K-го дня года, если известно, что в этом году 1 января было вторником.

Этот пример отличается от предыдущих тем, что воскресенье имеет номер 7, а не 0. Поэтому если просто находить остатки по формуле K mod 7, как в задаче Integer24, то для дней 1–6 (с понедельника по субботу) формула даст правильный результат. Но уже при K кратном 7 (7, 14, ... – воскресенье) мы получим номер 0 вместо 7: 7 mod 7 = 0. Тогда как быть?

Здесь можно поступить так: номер K уменьшить на 1, а к остатку прибавить 1, в результате чего сумма не изменится, но уже при K=7 (воскресенье) мы получим результат 7, а не 0: (7-1) mod 7 + 1 = 7.

Таким образом, если 1 января – понедельник, то день недели для K-го дня года равен (K-1) mod 7 + 1. Но для задачи Integer26 1 день года вторник, поэтому K-1 нужно увеличить на 1, в результате чего получим: K mod 7 + 1. Для среды имеем (K+1) mod 7 + 1, для четверга – (K+2) mod 7 + 1, пятницы – (K+3) mod 7 + 1, субботы – (K+4) mod 7 + 1, воскресенья – (K+5) mod 7 + 1.

Вообще, если дни понедельник – воскресенье пронумерованы числами 1..7 соответственно, а на 1 января приходится день с номером N (1..7), то для опредедения дня недели K-го дня года можно воспользоваться формулой: (K+N-2) mod 7 + 1 – это задача Integer28 ниже.

var
  K: word;

begin
  write('K = ');
  readln(K);
  writeln;
  { Поскольку в неделе 7 дней, то номер дня определяем как остаток от 
  деления на 7. Если бы первый день приходился на понедельник (номер 1), 
  то для определения дня недели для K-го дня года достаточно взять 
  (K-1) mod 7 + 1. Но так как 1-й день года приходится на вторник, то к 
  K-1 нужно прибавить 1: (K-1)+1=K, а потом уже находить остаток: }
  writeln('Ответ: ', K mod 7 + 1);
  readln
end.

**type** word;: Представляет 16-битовое целое число без знака.Диапазон значений: 0 .. 65 535

**type** word;: Представляет 16-битовое целое число без знака.Диапазон значений: 0 .. 65 535

Integer27. Дни недели пронумерованы следующим образом: 1 — понедельник, 2 — вторник, …, 6 — суббота, 7 — воскресенье. Дано целое число K, лежащее в диапазоне 1–365. Определить номер дня недели для K-го дня года, если известно, что в этом году 1 января было субботой.

Все пояснения в коде программы, а также в предыдущей задаче Integer26.

var
  K: word;

begin
  write('K = ');
  readln(K);
  writeln;
  { Поскольку в неделе 7 дней, то номер дня определяем как остаток от 
  деления на 7. Если бы первый день приходился на понедельник (номер 1), 
  то для определения дня недели для K-го дня года достаточно взять 
  (K-1) mod 7 + 1. Но так как 1-й день года приходится на субботу (день 6), 
  то к K-1 прибавляем 5 (6-1=5): (K-1)+5=K+4, а потом находим остаток: }
  writeln('Ответ: ', (K + 4) mod 7 + 1);
  readln
end.

**type** word;: Представляет 16-битовое целое число без знака.Диапазон значений: 0 .. 65 535

**type** word;: Представляет 16-битовое целое число без знака.Диапазон значений: 0 .. 65 535

Integer28. Дни недели пронумерованы следующим образом: 1 — понедельник, 2 — вторник, …, 6 — суббота, 7 — воскресенье. Дано целое число K, лежащее в диапазоне 1–365, и целое число N, лежащее в диапазоне 1–7. Определить номер дня недели для K-го дня года, если известно, что в этом году 1 января было днем недели с номером N.

Рассмотрение дано в задаче Integer26, также читайте комментарии к коду:

var
  K, N: word;

begin
  write('K = ');  
  readln(K);
  write('N = ');
  readln(N); 
  writeln;
  { Поскольку в неделе 7 дней, то номер дня определяем как остаток от 
  деления на 7. Если бы первый день приходился на понедельник (номер 1),
  то для определения дня недели для K-го дня года достаточно взять 
  (K-1) mod 7 + 1. Но так как 1-й день года приходится на день N, то 
  к K-1 прибавляем N-1: (K-1)+N-1=K+N-2, а потом находим остаток: }
  writeln('Ответ: ', (K + N - 2) mod 7 + 1);
  readln
end.

**type** word;: Представляет 16-битовое целое число без знака.Диапазон значений: 0 .. 65 535

**type** word;: Представляет 16-битовое целое число без знака.Диапазон значений: 0 .. 65 535