Допустим, мы ведем счет дней недели с воскресенья и присваиваем дням такие номера: 0- Вс, 1- Пн, 2- Вт, 3- Ср, 4- Чт, 5- Пт, 6- Сб. Определим, когда в январе было первое Вс. Если 31 был Пн, то 4 недели назад, т.е. 31-28=3 числа тоже был Пн. А Вс было перед Пн, т.е. 2 января. Числа от 0 до 6 - это остатки целочисленного деления на 7. Получается, что остаток деления числа 2 на 7, должен привести нас к нулю. А он равен двум. Идея: вычтем из остатка 2, чтобы получился ноль. Идея хороша для остатка 2, 3, 4, 5, и 6. Она даст нам значения 0, 1, 2, 3 и 4. А вот для остатков 0 и 1, она даст -2 и -1, что нехорошо. Внесем корректировку. если получилось отрицательное значение, увеличим его на 7. Проверим ,будет ли это работать. 1 января - Сб (номер дня 6) алгоритм дает 1-2 = -1 и +7 = 6 - верно 2 января - Вс (номер дня 0) алгоритм дает 2-2 = 0 - верно 3 января - Пн (номер дня 1) алгоритм дает 3-2 = 1 - верно 4 января - Вт (номер дня 2) алгоритм дает 4-2 = 2 - верно 5 января - Ср (номер дня 3) алгоритм дает 5-2 - 3 - верно 6 января - Чт (номер дня 4) алгоритм дает 6-2 = 4 - верно 7 января - Пт (номер дня 5) алгоритм дает 0-2 = -2 и +7 = 5 - верно 8 января - Сб (номер дня 6) алгоритм дает 1-2 = -1 и +7 = 6 - верно 9 января - Вс (номер дня 0) алгоритм дает 2-2 = 0 - верно
Все работает.
// PascalABC.NET 3.3, сборка 1625 от 17.01.2018 // Внимание! Если программа не работает, обновите версию!
begin var chislo:=ReadInteger('Номер дня в январе 2011 года:'); chislo:=chislo mod 7-2; if chislo<0 then chislo:=chislo+7; var y:string; case chislo of 0:y:='Воскресенье'; 1:y:='Понедельник'; 2:y:='Вторник'; 3:y:='Среда'; 4:y:='Четверг'; 5:y:='Пятница'; 6:y:='Суббота' end; Writeln('Это ',y) end.
Примеры Номер дня в январе 2011 года: 31 Это Понедельник
1) Переводим 1100111112 в десятичную систему:
1100111112 = 1·28+1·27+0·26+0·25+1·24+1·23+1·22+1·21+1·1 = 41510
2)Переводим целую часть 29710 в 2-ую систему последовательным делением на 2:
297/2 = 148, остаток: 1
148/2 = 74, остаток: 0
74/2 = 37, остаток: 0
37/2 = 18, остаток: 1
18/2 = 9, остаток: 0
9/2 = 4, остаток: 1
4/2 = 2, остаток: 0
2/2 = 1, остаток: 0
1/2 = 0, остаток: 1
29710 = 1001010012
3)Переводим 4758 в десятичную систему:
4758 = 4·82+7·81+5·1 = 31710
Переводим целую часть 31710 в 2-ую систему последовательным делением на 2:
317/2 = 158, остаток: 1
158/2 = 79, остаток: 0
79/2 = 39, остаток: 1
39/2 = 19, остаток: 1
19/2 = 9, остаток: 1
9/2 = 4, остаток: 1
4/2 = 2, остаток: 0
2/2 = 1, остаток: 0
1/2 = 0, остаток: 1
31710 = 1001111012
4)Окончательный ответ: 11101(2) + 110011(2) = 1010000(2)
5)Окончательный ответ: 100110011(2) * 1001101(2) = 101110001010111(2)
6)Окончательный ответ: 1111011(2) - 111011(2) = 1000000(2)