JuniorКодЧастоЕщё не отвечали
Определите, является ли год високосным
Верните true, если year — високосный год по правилам григорианского календаря.
Требования:
делится также на 400. То есть 2000 → true, 1900 → false, 2024 → true.
- Делится на 4, КРОМЕ вековых лет (делятся на 100), ЕСЛИ ТОЛЬКО год не
- Выразите это одним булевым выражением, а не вложенными
if. - Не используйте
std::chrono::year::is_leap().
bool isLeapYear(int year) {
// ваш код здесь
}
Допишите реализацию.
Год високосный, если делится на 4, кроме вековых (делится на 100), если только он не делится также на 400. 2000 — да, 1900 — нет, 2024 — да.
- ✗Проверять только
year % 4 == 0, забывая исключение для вековых лет - ✗Писать вложенные if, делающие логику трудночитаемой, вместо одного булевого выражения
- ✗Не обрабатывать год 0 или отрицательные года, если API их принимает
- →Каково правило Григорианского календаря и почему оно было введено?
- →Как работает
std::chrono::year::is_leap()в C++20?
Оглавление
Задача
Напишите функцию, которая определяет, является ли год високосным по правилам григорианского календаря.
Решение
#include <cassert>
// Правило: делится на 4, НО не на 100, ИЛИ делится на 400
constexpr bool isLeapYear(int year) {
return (year % 4 == 0) && (year % 100 != 0 || year % 400 == 0);
}
int main() {
assert( isLeapYear(2000)); // делится на 400 → да
assert(!isLeapYear(1900)); // делится на 100, но не на 400 → нет
assert( isLeapYear(2024)); // делится на 4, не на 100 → да
assert(!isLeapYear(2023)); // не делится на 4 → нет
assert( isLeapYear(1600)); // делится на 400 → да
assert(!isLeapYear(1700)); // делится на 100, но не на 400 → нет
}
Ключевые моменты
- Условие можно записать одной булевой строкой без вложенных if.
constexprпозволяет вычислять результат на этапе компиляции.- C++20:
std::chrono::year{2024}.is_leap()делает то же самое.
Оглавление