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