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

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

Вздумалось коллеге посчитать, сколько "чёрных пятниц" (они же "Пятница, 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 так и написано

Почему 2000-й год относился к 20 веку, а не к 21-му?
Потому же, почему 20-я бутылка пива в 20-бутылочном первом распитом ящике относится к нему, а не ко второму ящику.

09.10.2015, 16:00 [8801 просмотр]


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

К этой статье пока нет комментариев, Ваш будет первым