Подсчет 13 тых пятниц, из заданного интервала - C (СИ)

Узнай цену своей работы

Формулировка задачи:

По заданому интервалу двух дат, вывести количество 13тых пятниц, необходима только функция для нахождения. Пример использования:
#include <stdio.h>
#include <assert.h>

int CountFriday13 ( int y1, int m1, int d1,
                    int y2, int m2, int d2, long long int * cnt )
 {
   /* todo */
 }
 
int main ( int argc, char * argv [] )
 {
   long long int cnt;
 
   assert ( CountFriday13 ( 1900,  1,  1,
                            2015,  1,  1, &cnt ) == 1
            && cnt == 197LL );
   assert ( CountFriday13 ( 1900,  1,  1,
                            2015,  2,  1, &cnt ) == 1
            && cnt == 197LL );
   assert ( CountFriday13 ( 1900,  1,  1,
                            2015,  1, 13, &cnt ) == 1
            && cnt == 197LL );
   assert ( CountFriday13 ( 1900,  1,  1,
                            2015,  2, 13, &cnt ) == 1
            && cnt == 198LL );
   assert ( CountFriday13 ( 1904,  1,  1,
                            2015,  1,  1, &cnt ) == 1
            && cnt == 189LL );
   assert ( CountFriday13 ( 1904,  1,  1,
                            2015,  2,  1, &cnt ) == 1
            && cnt == 189LL );
   assert ( CountFriday13 ( 1904,  1,  1,
                            2015,  1, 13, &cnt ) == 1
            && cnt == 189LL );
   assert ( CountFriday13 ( 1904,  1,  1,
                            2015,  2, 13, &cnt ) == 1
            && cnt == 190LL );
   assert ( CountFriday13 ( 1905,  2, 13,
                            2015,  1,  1, &cnt ) == 1
            && cnt == 187LL );
   assert ( CountFriday13 ( 1905,  2, 13,
                            2015,  2,  1, &cnt ) == 1
            && cnt == 187LL );
   assert ( CountFriday13 ( 1905,  2, 13,
                            2015,  1, 13, &cnt ) == 1
            && cnt == 187LL );
   assert ( CountFriday13 ( 1905,  2, 13,
                            2015,  2, 13, &cnt ) == 1
            && cnt == 188LL );
   assert ( CountFriday13 ( 1905,  1, 13,
                            2015,  1,  1, &cnt ) == 1
            && cnt == 188LL );
   assert ( CountFriday13 ( 1905,  1, 13,
                            2015,  2,  1, &cnt ) == 1
            && cnt == 188LL );
   assert ( CountFriday13 ( 1905,  1, 13,
                            2015,  1, 13, &cnt ) == 1
            && cnt == 188LL );
   assert ( CountFriday13 ( 1905,  1, 13,
                            2015,  2, 13, &cnt ) == 1
            && cnt == 189LL );
   assert ( CountFriday13 ( 2015, 11,  1,
                            2015, 10,  1, &cnt ) == 0 );
   assert ( CountFriday13 ( 2015, 10, 32,
                            2015, 11, 10, &cnt ) == 0 );
   assert ( CountFriday13 ( 2090,  2, 29,
                            2090,  2, 29, &cnt ) == 0 );
   assert ( CountFriday13 ( 2096,  2, 29,
                            2096,  2, 29, &cnt ) == 1
            && cnt == 0LL );
   assert ( CountFriday13 ( 2100,  2, 29,
                            2100,  2, 29, &cnt ) == 0 );
   assert ( CountFriday13 ( 2000,  2, 29,
                            2000,  2, 29, &cnt ) == 1
            && cnt == 0LL );
   return 0;
 }

Решение задачи: «Подсчет 13 тых пятниц, из заданного интервала»

textual
Листинг программы
int WeekDays(int day, int month, int year) {
    int a = (14 - month) / 12;
    int y = year - a;
    int m = month + 12 * a - 2;
    return ((7000 + (day + y + y / 4 - y / 100 + y / 400 + (31 * m) / 12)) + 1 ) % 7;
}

Объяснение кода листинга программы

В данном коде функция WeekDays() принимает три аргумента типа int: day, month, year. Эта функция вычисляет день недели для заданной даты. В первых трех строках кода выполняются вычисления для определения века и года. Затем в следующей строке кода выполняется вычисление значения переменной m, которая представляет номер месяца в году. В последней строке кода выполняется вычисление дня недели для заданной даты. Функция возвращает значение типа int, представляющее день недели. Для определения дня недели используется математическая формула, которая учитывает различные факторы, такие как номер дня, номер месяца, год и т.д. Для определения дня недели используется оператор % (остаток от деления). В данном случае, результат вычисления 7000 + (день + y + y / 4 - y / 100 + y / 400 + (31 * m) / 12)) % 7 приводится к типу int и затем увеличивается на 1. Это позволяет получить день недели в виде числа от 0 до 6, где 0 соответствует пятнице, а 6 - четвергу. Затем результат выводится на экран.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 3.75 из 5
Похожие ответы