:: алгоритмы  и методы ::
:: олимпиадные задачи ::
:: связь ::
:: форум ::
:: о сайте ::
:: ссылки ::

Path: Разное » Проверка високосности года. Вычисление недели
  Проверка, високосный год или нет. Вычисление дня недели



1. Год делится на 400 -> високосный -> конец
2. Год делится на 100 -> не високосный -> конец
3. Год делится на 4 -> високосный -> конец
4. Год не високосный -> конец
5. Всё

А вот моя программка для определения дня недели. Кому надо - разберется. Работает вроде до 2100 года.

(*
Вычисление дня недели в приложениях автоматического вычисления
дня недели в датах от 1996 года и старше.
   
Copyright (C) Sergei Frolov, 1998.                                    
v1.0  Jan, 4, 1998.

Программа ориентирована на применение в приложениях, написанных
на языке ассемблера без использования аппаратного умножения/деления
и операций с плавающей запятой.
*)

program denned;                                                           

const                                                                    

  YEARS  : array[0.. 3] of byte = (0, 2, 3, 4);                        
  MONTHS : array[1..12] of byte = (0, 3, 3, 6, 1, 4, 6, 2, 5, 0, 3, 5);  
  DAYOFWEEKS  : array[0..6] of string =                                  
    ('Воскресенье', 'Понедельник', 'Вторник', 'Среда', 'Четверг',        
     'Пятница', 'Суббота');                                                

var       
                                                                
  a, b, c, d, e, f, tmp : byte;                                          
  day, month, year      : word;                                            

begin                                                                     

  repeat                                                                  

    write('Число XX -> ');
    readln(day);                                                         
    if day = 0 then break; { выход }                                      
    write('Месяц XX -> ');                                               
    readln(month);                                                        
    write('Год XXXX -> ');                                               
    readln(year);                                                       
    tmp := year - 1996;                                                  
    a := tmp and 3;                                                       
    b := (tmp shr 2) + (tmp and $FC);                                     
    c := MONTHS[month];                                                 
    if (a = 0) and (month > 2) then inc(c);                             
    a := YEARS[a];                                                      
    e := (a + b + c + day) mod 7;                                      
    writeln('Результат: ', DAYOFWEEKS[e]);                           
    writeln;                                                           

  until false;                                                         

end.                                                                   

Обсудить на форуме »


  Комментарии для веб-мастера













Автор: michael
Время: 20-07-03 11:31


Можно придумать алгоритм и поинтереснее:
  

  Вход:
    year  - год (2001..?)
    month - месяц (0..11)
    day   
- день (0..30)
  

  Выход:
    result - день недели (0..6)
  

 1. Корректный алгоритм.
  

  m[12] = {0, 3, 3, 6, 1, 4, 6, 2, 5, 0, 3, 5};
  t1 = year - 2000;
  
t2 = t1 / 100; t2r = t1 % 100; /* на ассемблере вычисляется одновременно 
*/
  t3 = t1 + (t1 >> 2) - t2 + (t2 >> 2) - 1;
  if ( ((t1 
& 0x0003 == 0) && ((t2r != 0) || (t2 & 0x0003 == 0))) 
&& (month < 2) ) then t3--;
  result = (t3 + m[month] + day) % 
7;
  

 2. Быстрый алгоритм (для 2001..2099 года).
  

  m[12] = {0, 3, 3, 6, 1, 4, 6, 2, 5, 0, 3, 5};
  t1 = year - 2001;
  
t2 = m[month];
  if ( (year & 0x0003 == 0) && (month >> 
1 != 0) ) then t2++;
  result = (t1 + (t1 >> 2) + t2 + day) % 7;
  

 Все переменные определяются типом uint (0..65535). А если кто запомнит 
массив m[], то по второму алгоритму день недели легко определяется в уме 
:).  

  

Ваши комментарии. Вопросы будут удалены: для них есть форум.
Имя:
E-mail:
  


Copyright 2000-2002 © Ilia Kantor, при поддержке проекта MANUAL.RU

АлгоЛист на CD