Как вычислить кол-во пятниц, которые попадают на 13 число?

Нужно найти кол-во пятниц, которые попадают на 13 число определённого промежутка времени:

  1. XX столетия
  2. всех столетий с номером n, где n - натуральное число

Ответы (2 шт):

Автор решения: MBo

Пройтись по всем годам века (знаете, в каком году XX век начался?), в каждом году по 13-м числам каждого месяца, и проверять день недели. "date.h" или другая библиотека для работы с датами, или волшебная формула dayofweek в помощь.

Даже если не учитывать периодичность в 28 лет внутри века, работы совсем немного.

→ Ссылка
Автор решения: Harry

Юлианская дата вам в помощь. Или книжица "Алгоритмы. Просто как 2x2" — там даже код есть. Все советы "идти по одному дню" с учетом всех високосных и длин месяцев дадут только очень запутанный код.

Вот эти волшебные функции по переводу "туда-сюда" для григорианского календаря.

По-хорошему, вычисляя число пятниц, 13 в России в XX веке (а равно ранее) — надо учитывать, что до 1918 года календарь у нас был юлианский (то, что мы называем старый стиль). Функции даны уже для нового.

Так что функции применимы для Европы (и то не всей...) с 1529 года примерно.

long julianDate(int y, int m, int d)
{
    if (m <= 2) {
        y--;
        m += 12;
    };
    long A = y/100;
    A = 2 - A + A/4;
    long J = (1461L * y)/ 4;
    long K = (306001L*(m + 1))/10000L;
    return J + K + d + 1720995L + A;
};

void grigorianDate(long JD,
                   int& y,  int& m, int&  d)
{
    long A = (JD*4 - 7468865L)/146097L;
    A = JD + 1 + A - (A/4L);
    long B = A + 1524;
    long C = (B*20L - 2442L)/7305L;
    long D = (C * 1461L) / 4L;
    long E = (10000L * (B-D)) / 306001L;
    d = B - D - E*306001L/10000L;
    m = ( E <= 13 ) ? E - 1 : E - 13;
    y = ( m > 2 ) ? C - 4716 : C - 4715;
};

int weekday(long jd) { return (jd+1)%7; }
// 0 - воскресенье, 1 - понедельник и т.д.

Этого вам хватит, чтоб написать свою программу. Ну, а я для примера покажу, как посчитать распределение тринадцатых чисел по дням недели. Григорианский календарь периодичен с периодом 400 лет, так что вычисляем на этом промежутке с любой начальной даты и получаем https://ideone.com/yPDYeb — итак, тринадцатое на пятницу выпадает чаще, чем на любой другой день недели :)

→ Ссылка