Этюды - Формула для вычисления дня недели.

ZX Review #7-8-9-10
(c) Jessica Justice, г.Колпашево

   В ZX-Ревю N1-2/97  в  разделе
"Этюды" Василий объявил  конкурс
на процедуру-календарь. Мне  из-
вестна отличная формула для  вы-
числения  дня  недели.   Формула
взята из книги "Задачи по  прог-
раммированию"  (авторы - С.А.Аб-
рамов, Г.Г.Гнездилова и др., се-
рия "Библиотечка  программиста",
изд. "Наука" 1988), а ее  авторы
ссылаются на "Computer  programs
that work!" (authors  Lee  J.D.,
Beech G., Lee T.D.).  Итак, фор-
мула: считается, что год лежит в
диапазоне от 1582 до 4902.  Тог-
да номер дня  недели  (0-воскре-
сенье, 1-понедельник, ... 6-суб-
бота) равен остатку  от  деления
на 7 значения выражения:

  [2.6m-0.2]+d+y+[y/4]+[c/4]-2c

где d - номер дня в месяце (1...
31), m -  номер  месяца  в  году
(нумерация начинается  с  марта,
т.е. 1-март, 2-апрель,... 10-де-
кабрь, январь и февраль считают-
ся месяцами с номерами 11  и  12
предыдущего года); c - две стар-
шие цифры  года  (15...49);  y -
младшие  цифры  года  (00...99);
[x] - означает целую часть  чис-
ла.

   На  Бейсике  программа  может
выглядеть так:

10 INPUT "day=",day
20 INPUT "month=",month
30 INPUT "year=",year
40 IF  month<3 THEN LET month=month+12 :
   LET year=year-1 : REM Если январь или
   февраль, то это последние месяцы преды-
   дущего года
50 LET month=month-2 :
   REM Нумерация начинается с марта
60 LET y$=STR$ year
70 LET c=VAL (y$(1 TO 2)) :
   REM Первые две цифры года
80 LET y=VAL (y$(2 TO 4)) :
   REM Вторые две цифры года
90 LET value=INT (2.6*month-02)+day+y+INT
   (y/4)+INT (c/4)-2*c
100 LET  week=value-7*(INT(value/7)) :
    REM  week  -  остаток от деления
    выражения на семь и является номером
    дня недели
110 PRINT "Day of week -";week

   В результате на экране  полу-
чим номер дня недели (0..6).

   Чтобы воплотить все это в ма-
шинном коде, придется обратиться
к помощи калькулятора. Увы, я не
настолько хорошо знаю  калькуля-
тор, быть может, кто-то из чита-
телей  "Ревю"  сможет  выполнить
этот алгоритм в Ассемблере?

           *   *   *