Какой самый простой алгоритм, чтобы найти день недели нулевого дня данного года? - PullRequest
10 голосов
/ 26 января 2009

Я пытаюсь выяснить, какой день недели нулевого дня (1 января) данного года.

До сих пор я просматривал страницу Википедии ' Расчет дня недели ', но мне было интересно, есть ли самый простой алгоритм, если вы просто пытаетесь найти нулевой день.

Ответы [ 12 ]

15 голосов
/ 26 января 2009

Вот простой однострочник. Я проверял это за все годы 1901-2200, используя Excel, и 1582-3000, используя Python's datetime.

.
dayOfWeek = (year*365 + trunc((year-1) / 4) - trunc((year-1) / 100) +
             trunc((year-1) / 400)) % 7

Это даст день недели как 0 = воскресенье, 6 = суббота. Этот результат можно легко скорректировать, добавив константу до или после модуля 7. Например, чтобы соответствовать соглашению Python о 0 = понедельник, добавьте 6 перед модулем.

8 голосов
/ 25 мая 2009
int dayofweek(y, m, d)      /* 0 = Sunday */
int y, m, d;                /* 1 <= m <= 12,  y > 1752 or so */
{
    static int t[] = {0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4};
    y -= m < 3;
    return (y + y/4 - y/100 + y/400 + t[m-1] + d) % 7;
}
8 голосов
/ 26 января 2009

Большинство языков предоставляют возможности для представления и манипулирования датами ... Я бы использовал их вместо реализации какого-либо (возможно, неполного) алгоритма.

3 голосов
/ 26 января 2009

Я нахожу это немного более практичным, чем статья в Википедии, но это все еще универсально:

http://stason.org/TULARC/society/calendars/2-5-What-day-of-the-week-was-2-August-1953.html

2 голосов
/ 29 сентября 2012
public String DayOfWeek()
{
    int dayofweek;
    int c,y,m,d; 
    int cc,yy;
    String dayString;
    //Im using the guassian algorithm for finding day of the week 
    cc = year/100;
    yy = year - ((year/100)*100);

    c = (cc/4) - 2*cc-1;
    y = 5*yy/4;
    m = 26*(month+1)/10;
    d = day;

    dayofweek = (c+y+m+d)%7;

    switch(dayofweek)
    {
        case 0: dayString = "Sunday";
        break;
        case 1: dayString = "Monday";
        break;
        case 2: dayString = "Tuesday";
        break;
        case 3: dayString = "Wednesday";
        break;
        case 4: dayString = "Thursday";
        break;
        case 5: dayString = "Friday";
        break;
        case 6: dayString = "Saturday";
        break;
        default: dayString = "Sorry Could not compute month :(";   
    }

    return dayString;
}

Код выше написан на Java

не уверен, почему это работает, но я нашел этот алгоритм глубоко в недрах поиска Google и быстро запрыгнул на него для моего проекта. то, что вы видите выше, это метод, который я должен был написать для проекта, который я делал в своем классе java в колледже, поэтому он был написан мной, но алгоритм не мой.

этот метод гарантированно будет работать на 100%, если время, я пробовал несколько дней на протяжении истории и искал их, чтобы подтвердить, что правильный ответ был найден этим методом.

Пусть дата будет DD / MM / CCYY (европейский формат), где DD - день месяц, MM - месяц, CC - столетние цифры, а YY - год в течение века. Итак, день рождения Вильмы был 23/06/1994. Начиная с Век CC-цифры, рассчитать CC / 4 - 2 * CC-1 и запомнить результат. Со всеми делениями в этом упражнении откажитесь от остатков и просто сохранить всю часть. Итак, в нашем примере это 19/4 = 4 минус 2 * 19 = 38 минус 1, что дает минус 35.

Теперь, используя год YY, рассчитать 5 * ГГ / 4. В этом примере это 5 * 94 = 470/4 = 117, выбрасывая остаток. Добавление этого к нашему существующему результату дает 117-35 = 82.

Используя месяц ММ, рассчитать 26 * (ММ + 1) / 10. В наш пример это 26 * 7 = 182/10 = 18, снова отбрасывая остаток. Добавьте это к нашему текущему итогу, получив 82 + 18 = 100.

Наконец, просто добавьте день DD. Здесь 100 + 23 = 123.

Теперь делим результат на 7, просто оставшийся остаток; здесь 123 (мод 7) = 4. Считая воскресенье как ноль, понедельник = 1 и т. Д., Мы получаем 4 = четверг. Легко, когда знаешь как :-)

Алгоритм приписывается гауссу. Да, я знаю, что евреи и мусульмане имеют разные календари и Я знаю о различных календарных реформах, так что это относится только к современные христианские стандартизированные даты, не используйте его для проверьте день распятия Христа (-ффикция) или даже Чосера рождение.

Если вы не можете сделать это как умственную арифметику (таким образом, выиграть пиво в пабе) не стесняйтесь использовать карандаш и бумагу (или калькулятор).

1 голос
/ 23 января 2016

Процедура MATLAB:

функция w = день недели (м, д, ци)

если m> 2, m = m-2; иначе m = m + 10; cy = cy-1; конец;

c = fix (cy / 100); y = mod (cy, 100);

w = mod (d + fix (m * 2.59) + fix (y * 1.25) + fix (c * 5.25), 7);


Хитрость заключается в том, чтобы поставить 1 марта первым днем ​​года. Независимо от того, является ли дата високосным годом или нет.

Примеры:

   w = week_day(01,23,2016)  --->   w = 6 {Sat)    Today
   w = week_day(12,31,1999)  --->   w = 5 {Fri)    
   w = week_day(01,01,2000)  --->   w = 6 {Sat)
   w = week_day(02,28,1900)  --->   w = 3 {Wed)    not leap year
   w = week_day(03,01,1900)  --->   w = 4 {Thu)
   w = week_day(02,29,2000)  --->   w = 2 {Tue)      leap year
   w = week_day(03,01,2000)  --->   w = 3 {Wed)

Пожалуйста, обратитесь ID файла обмена файлами Mathwork # 54784

Фен Ченг Чанг

1 голос
/ 11 марта 2013
     #!/usr/local/bin/perl 
     use integer
     %day=                 (0=>Sunday,1=>Monday,2=>Tuesday,3=>Wednesday,4=>Thursday,5=>Friday,6=>Saturday);
     print("entered date is");
     $day=30;
     $month=11;
     $year=2680;
     $x=&day_of_week($year,$month,$day);
     if($day>31||$month>12)
{
    print("this date doesn't exist \n");
    exit;
}

    if($year%400 ==0 || ($year%100 != 0 && $year%4 == 0))
{
    if($day>29&&$month==2)
    {
        printf("this date dosen't exist \n");
        exit;
    }
}
   if($month==(4,6,9,11)&&$day>30)
{
        printf("this date dosen't exist \n");
        exit;
}


     sub day_of_week{
my ($year,$month,$day)=@_;
print("yy/mm/dd: $year/$month/$day\n");
my  $a=(14-$month)/12;
my  $y=$year-$a;
my  $m=$month+12*$a-2;
my  $d=($day+$y+$y/4-$y/100+$y/400+31*$m/12)%7;
return $d;
}
if(exists($day{$x}))
{
    print("$day{$x}\n");
}
else
{
    print("invalid date entered\n");
}
0 голосов
/ 16 января 2014

Если дата - ДД / ММ / ССГГ, и вам необходимо рассчитать день для данной даты. Затем используйте данную формулу [{(CC / 4) -2 * CC -1} + (YY * 5/4) + {(MM + 1) * 26/10} + DD] = x, x / 7 = Y, где Y - остаток, где Y может быть 0,1,2,3,4,5,6. где 0 можно обозначить как воскресенье, 1 - понедельник, 2 - вторник, 3 - среда и т. д.

0 голосов
/ 01 мая 2013
day = (((year - 1) * 365) + ((year - 1) / 4) - ((year - 1) / 100) + ((year) / 400) + 1) % 7;

Учитывая год, он найдет день недели для 1 января, где воскресенье - 0, а суббота - 6

0 голосов
/ 26 января 2009

Годы повторяются в 28-летнем цикле. Разделите год на 28 и верните соответствующий день недели (значения дня недели, хранящиеся в массиве / векторе). Это был бы самый быстрый и простой алгоритм . Но этот алгоритм не совсем понятен кому-то, читающему код. Ваш выбор зависит от того, хотите ли вы быстро, просто или «четко правильно».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...