Integer28. Дни недели пронумерованы следующим образом: 1 — понедельник, 2 — вторник, …, 6 — суббота, 7 — воскресенье. Дано целое число $$K$$, лежащее в диапазоне 1–365, и целое число N, лежащее в диапазоне 1–7. Определить номер дня недели для $$K$$-го дня года, если известно, что в этом году 1 января было днем недели с номером N.
Решение:
1 2 3 4 5 6 7 8 9 10 11 |
program Integer28; var K,N,D: Integer; begin Write('Введите день этого года: '); Readln(K); Write('Введите каким номером недели было 1 января: '); Readln(N); D:=((K+N-2) mod 7)+1; Writeln('День недели : ',D); end. |
Другие задачи из раздела Integer можно посмотреть здесь.
Поясните, пожалуйста, почему именно так решается. Никак не могу понять, почему именно n-2 и +1
Здесь на самом деле -2 это -1 и -1. В задаче два этапа , первое сделать диапозон выходящих значений от 1 до 7. и вторая что бы можно было задавать, с какого дня недели начинается год.
Т.к. результатом выражения (k mod 7) является диапазон от 0 до 6.
Решим для начала задачу, где дни недели это Na от 0- понедельник до 6-воскресенье.
Если в выражении (k mod 7) подтавить 1, мы узнаем с какого дня начинается год сейчас. (1 mod 7)=1 и получается вторник.
Так как у нас Na начинается с 0- понедельника, сделаем что бы первый день года был понедельником.
Что бы у нас получился понедельник надо из первого дня года вычесть 1 и получается:((1-1) mod 7)=0.
Тоесть ((k-1) mod 7)
Теперь добавим в это выражение Na ((k-1)+Na mod 7). При этом в первый день года и Na равным 0-понедельник будет ((1-1)+0 mod 7)=0 тоесть понедельник и всё ок 🙂
Подведём итог: (k-1+Na mod 7)=(получается диапозон Na)
3) Теперь нам нужно сделать что бы дни недели начинались с 1-понедельник и заканчивались 7-воскресенье тоесть привести к диапазону N.
При этом логично, что N=Na+1 и из этого следует, что N-1=Na, тоесть Na=N-1.
Подставляем в
((K-1)+Na mod 7)=(получается диапозон Na)
((K-1)+(N-1) mod 7)=(диапозон как N-1)
((K-1)+(N-1) mod 7)+1=(диапозон как N)
И получаем исходное выражение:
((K+N-2) mod 7)+1=(диапозон как N)
Спасибо большое за подробное разъяснение 🙂
Вот так
Тоже можно D:=(K+N-1) mod 7;
Writeln(‘день недели’, D);