БлогNot. Сколько "чёрных пятниц" или считаем количество чисел, выпавших на день недели

Помощь дата->рейтинг Поиск Почта RSS канал Статистика nickolay.info Домой

Сколько "чёрных пятниц" или считаем количество чисел, выпавших на день недели

Вздумалось коллеге посчитать, сколько "чёрных пятниц" (они же "Пятница, 13-е") бывает за период времени. Но описаний и обсуждений в инете много, а готовой функции нет. Ниже приведена как раз такая функция, правда, не проверял детально.

Функция считает, сколько раз в году year0 встречался день недели weekday, приходящийся на число месяца day. Если входные значения year0 или weekday недопустимы, то функция вернёт 0. Если недопустим day, это проконтролируется в цикле подсчёта.

#include <stdio.h>

int countweekdays (int year0, int weekday, int day) {
//Сколько раз в году year0 (4 цифры, число больше 0)
//встречался день недели weekday (0=Сб,1=Вс,...,6=Пт)
//для числа месяца day (1-31)
 if (year0<0 || weekday<0 || weekday>6) return 0;
 int mondays[12]={31,28,31,30,31,30,31,31,30,31,30,31};
 if ((year0%4==0) && (year0%100!=0) || (year0%400==0)) mondays[1]=29;
 int count=0,year,month;
 for (int m=1; m<13; m++) {
	 if (day<1 || day>mondays[m-1]) continue;
	 if (m<3) { month=m+12; year=year0-1; } else { month=m; year=year0; }
	 int c=year/100,y=year%100,wd=( (month+1)*26/10+day+y+y/4+c/4-2*c ) % 7;
	 if (wd == weekday) count++;
 }
 return count;
}

int main() {
 int c20=0;
 for (int year=1901; year<2001; year++) c20+=countweekdays(year,6,13);
 int c21=0;
 for (int year=2001; year<2101; year++) c21+=countweekdays(year,6,13);
 printf ("\n20 century: %d, 21 century: %d",c20,c21);
 getchar();
 return 0;
}

Применяем функцию в цикле по годам - и получаем искомый ответ для любой "Пятницы 13" или "Субботы 14". Я лично в этом тесте проверил, сколько "чёрных пятниц" было в 20 и 21 веке.

Результат - в 20 веке было 166 черных пятниц, а в 21 всего 165 :)

Кстати:
20 век закончился 31 декабря 2000 года, а не 1999-го, в main так и написано


теги: c++ числа алгоритм дата

09.10.2015, 16:00; рейтинг: 5442

  свежие записипоиск по блогукомментариистатистика

Наверх Яндекс.Метрика
© PerS
вход