Leap Year
Дан год year григорианского календаря. Верните true, если это високосный год, в котором есть 29 февраля, и false в противном случае.
Год является високосным, если он делится на 4, за исключением годов, делящихся на 100: они не являются високосными, если также не делятся на 400.
Функция
- yearinteger
- год для проверки
- Возвращаетboolean
- true, если в году есть 29 февраля, иначе false
Ограничения
1 ≤ year ≤ 106
Примеры
- Ввод
- year = 2024
- Вывод
- true
- Пояснение
2024делится на4и не является годом, заканчивающимся на два нуля, поэтому это високосный год.
- Ввод
- year = 1900
- Вывод
- false
- Пояснение
1900делится на4, но также делится на100и не делится на400, поэтому применяется исключение для столетий, и этот год не является високосным.
- Ввод
- year = 2000
- Вывод
- true
- Пояснение
2000делится на100, что исключило бы его, но оно также делится на400, что снова делает его подходящим. Это високосный год.
+16 скрытых тестов при отправке
Подсказки
Открывайте по одной. Каждая подсказывает чуть больше.
Остаток
0при делении на4— это первое правило. Какие годы ему не соответствуют?Вековые годы нарушают это правило, а числа, кратные
400, в свою очередь, являются исключением из правила для вековых лет. Каждое число, кратное400, также кратно100и4, поэтому порядок проверок определяет ответ.Сначала проверьте делимость на
400, затем на100, затем на4и следуйте первому подходящему правилу. Или объедините условия: число делится на 4 и не делится на 100 либо делится на 400.
Решение
Для каждого правила нужна только одна операция взятия остатка, поэтому нужно выполнить три проверки делимости. Сложность заключается в порядке: правила противоречат друг другу для таких годов, как 2000, которые являются и столетними, и кратными 400. Проверяй сначала самое конкретное правило или запиши правило в виде одного выражения, в котором скобки удерживают исключения на своих местах.
Проверяй правила от наиболее конкретных к наименее конкретным
Идея
Три правила образуют цепочку исключений. Делимость на 4 делает год високосным, делимость на 100 отменяет это, а делимость на 400 отменяет отмену. Год, соответствующий более позднему правилу, всегда соответствует и более ранним: каждое число, кратное 400, кратно 100, а каждое число, кратное 100, кратно 4.
Поэтому ответ определяет самое конкретное подходящее правило. Сначала проверьте 400, затем 100, затем 4 и возвращайте результат, как только одно из условий выполнится. Для 2000 первая проверка сразу даёт положительный ответ. Для 1900 первая проверка не проходит, а вторая даёт отрицательный ответ. Для 2024 первые две проверки не проходят, а третья даёт положительный ответ.
Если не подходит ни одно из трёх условий, год вообще не делится на 4, поэтому он является обычным.
Алгоритм
- Если
year % 400 == 0, вернитеtrue. - Если
year % 100 == 0, вернитеfalse. - Если
year % 4 == 0, вернитеtrue. - В противном случае верните
false.
def isLeapYear(year):
if year % 400 == 0:
return True
if year % 100 == 0:
return False
if year % 4 == 0:
return True
return FalseОдно логическое выражение
Идея
Читайте правило как два способа определить високосный год. Либо год делится на 4 и не является вековым, либо он делится на 400. Это предложение дословно переводится в (year % 4 == 0 and year % 100 != 0) or year % 400 == 0.
Проверьте это на трёх примерах. 2024 проходит первую часть. 1900 не проходит первую часть, потому что это вековой год, и не проходит вторую, потому что 1900 % 400 равно 300. 2000 не проходит первую часть по той же причине, что и 1900, и проходит вторую.
Можно также сгруппировать это иначе: делится на 4 и либо не является вековым, либо кратен 400. Обе формы дают одинаковый результат для каждого года. Выражение выполняет не более тех же трёх проверок, что и цепочка if.
Алгоритм
- Вычислите
year % 4 == 0 and year % 100 != 0: делится на 4 и не является годом, заканчивающимся на два нуля. - Вычислите
year % 400 == 0. - Верните
true, если выполняется хотя бы одно из условий.
def isLeapYear(year):
# Every 4th year, except centuries, except every 400th year.
return (year % 4 == 0 and year % 100 != 0) or year % 400 == 0
Ловушки и крайние случаи
Каждая ошибка здесь возникает из-за того, что правило рассматривают как одну проверку, а не как цепочку исключений.
- Проверка только
year % 4 == 0. Она даёт правильный ответ для каждого года с1901по2099, поэтому ошибка остаётся незаметной, и неправильный ответ для1900и2100. - Проверка
100перед400в цепочке if. Проверка на столетие возвращаетfalseдля2000ещё до того, как выполнится проверка400. - Пропуск условия делимости на 4. Выражение
year % 100 != 0 or year % 400 == 0считает2023високосным годом, потому что2023не является годом, кратным 100. - Использование
year / 4вместо остатка. Деление показывает, сколько раз4помещается в числе; остаток показывает, делится ли оно на 4 без остатка.
Частые вопросы4
Каково правило определения високосного года?
Григорианский год является високосным, если он делится на 4, кроме случаев, когда он делится на 100. Год, делящийся на 400, в любом случае является високосным. Поэтому 2024 и 2000 — високосные годы, а 1900 и 2100 — нет.
Почему 1900 год не високосный, а 2000 год — високосный?
Оба года являются вековыми, то есть делятся на 100, что обычно исключает год. 2000 также делится на 400, и это правило имеет приоритет над правилом для вековых лет. При делении 1900 на 400 остаток равен 300, поэтому этот год остаётся обычным.
Почему существуют правила определения високосных лет для вековых годов?
Солнечный год длится около 365.2422 дня. Добавление одного дня каждые 4 года даёт в среднем 365.25 дня, что примерно на 3 дня больше каждые 400 лет. Пропуск високосного дня в 3 из каждых 4 вековых лет устраняет эти 3 дня. Среднее значение становится 365.2425 дня — достаточно близким, чтобы календарь тысячи лет оставался синхронизированным со сменой времён года.
Какова временная сложность проверки високосного года?
Это O(1) по времени и памяти. Проверка требует не более трёх операций взятия остатка и нескольких сравнений независимо от величины года.
Похожие задачи
Задачи на те же идеи. Решите две или три, и приём запомнится.
Python
def isLeapYear(year):
# Напишите код здесьСлучай 1
Случай 2
Случай 3
Ввод
year = 2024
Ожидается
true