
На с++ Министр культуры определил, что фестивали можно проводить только в субботу 5-го или субботу
6-го числа любого месяца, а также в четверг каждого числа, кратного n (n меняется от года к году), любого месяца. Необходимо определить все возможные даты проведения фестивалей на ближайший год, если первое января был k-ый день недели (где k=1 - понедельник, а k=7 - воскресенье). Формат входных данных Вводятся целые неотрицательные числа n (1 <= n <= 31) и k (1 <= k <= 7) Формат выходных данных Вывести даты в столбик в формате: "14 of June", где June - название месяца (июнь) Примечания Названия месяцев: January (январь), February (февраль), March (март), April (апрель), May (май), June (июнь), July (июль), August (август), September (сентябрь), October (октябрь), November (ноябрь), December (декабрь). В феврале 28 дней. Примеры входные данные выходные данные 27 5 6 of February 6 of March 27 of May 5 of June 6 of November

Ответы на вопрос

Алгоритм решения
Почти никакой математики - проходим по всем дням в году, начиная с первого дня, проверяем условия, обновляем ответ.
Детали
Для удобства заведем константный массив чисел - количество дней в каждом месяце. С его помощью мы будет перескакивать из последнего дня одного месяца в первый день следующего.
Нам не нужно переходить из декабря в январь!
Также заведем массив строк, хранящий названия каждого месяца.
Будем поддерживать номер текущего дня, номер текущего месяца и каким днем недели является текущий день. Текущий день и день недели у нас нумеруются с единицы, месяц - с нуля.
Пока мы не прошли весь декабрь, проверяем условия. Первый вариант: dayInWeek == суббота, day == 5 или day == 6. Второй вариант: dayInWeek == четверг, day % n == 0.
Пытаемся перейти на следующий день. Если следующий день начнется уже в следующем месяце, увеличим месяц, день сбросим до единицы. Ну и обновим день в неделе: dayInWeek = dayInWeek % 7 + 1.




Для решения этой задачи на C++ можно использовать циклы и условные операторы. Вот пример кода, который решает задачу:
cpp#include <iostream>
#include <string>
bool isLeapYear(int year) {
return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
}
int main() {
int n, k;
std::cin >> n >> k;
// Массив с названиями месяцев
std::string months[] = {
"January", "February", "March", "April", "May", "June",
"July", "August", "September", "October", "November", "December"
};
// Перебираем все месяцы
for (int month = 1; month <= 12; month++) {
// Проверяем фестивали в субботу
int saturday = (k <= 6 - month % 2) ? 5 - k + month % 2 : 12 - k + month % 2;
if (saturday <= 28) {
std::cout << saturday << " of " << months[month - 1] << std::endl;
}
// Проверяем фестивали в четверг
if (n > 0) {
for (int day = 1; day <= 31; day++) {
if (day % n == k % n && day <= (isLeapYear(2023) ? 29 : 28)) {
std::cout << day << " of " << months[month - 1] << std::endl;
}
}
}
}
return 0;
}
В этом коде мы сначала считываем значения n
и k
из входных данных. Затем мы используем цикл for
, чтобы перебрать все месяцы. Внутри этого цикла мы сначала проверяем возможность проведения фестиваля в субботу, а затем в четверг с использованием ещё одного вложенного цикла. Если условия выполняются, мы выводим дату фестиваля в соответствующем формате.
Пожалуйста, обратите внимание, что в этом примере кода предполагается, что мы работаем с годом 2023. Если вам нужно рассчитать даты на другой год, вам необходимо изменить функцию isLeapYear
соответственно.


Топ вопросов за вчера в категории Информатика







Последние заданные вопросы в категории Информатика
-
Математика
-
Литература
-
Алгебра
-
Русский язык
-
Геометрия
-
Английский язык
-
Химия
-
Физика
-
Биология
-
Другие предметы
-
История
-
Обществознание
-
Окружающий мир
-
География
-
Українська мова
-
Информатика
-
Українська література
-
Қазақ тiлi
-
Экономика
-
Музыка
-
Право
-
Беларуская мова
-
Французский язык
-
Немецкий язык
-
МХК
-
ОБЖ
-
Психология
-
Физкультура и спорт
-
Астрономия
-
Кыргыз тили
-
Оʻzbek tili