Leap Year
Otrzymujesz rok year kalendarza gregoriańskiego. Zwróć true, jeśli jest to rok przestępny, czyli taki, który ma 29 lutego, a w przeciwnym razie false.
Rok jest przestępny, gdy jest podzielny przez 4, z wyjątkiem lat podzielnych przez 100, które nie są przestępne, chyba że są również podzielne przez 400.
Funkcja
- yearinteger
- rok do sprawdzenia
- Zwracaboolean
- true, gdy rok ma 29 lutego, false w przeciwnym razie
Ograniczenia
1 ≤ year ≤ 106
Przykłady
- Wejście
- year = 2024
- Wyjście
- true
- Wyjaśnienie
2024jest podzielne przez4i nie jest rokiem stulecia, więc jest rokiem przestępnym.
- Wejście
- year = 1900
- Wyjście
- false
- Wyjaśnienie
1900jest podzielne przez4, ale jest również podzielne przez100i nie jest podzielne przez400, więc obowiązuje wyjątek dotyczący lat stulecia i nie jest to rok przestępny.
- Wejście
- year = 2000
- Wyjście
- true
- Wyjaśnienie
2000jest podzielne przez100, co wykluczałoby ten rok, ale jest również podzielne przez400, co sprawia, że znów się kwalifikuje. To rok przestępny.
+16 ukrytych testów przy wysłaniu
Podpowiedzi
Otwieraj je po kolei. Każda zdradza trochę więcej.
Reszta z dzielenia przez
4równa0to pierwsza reguła. Które lata jej nie spełniają?Lata kończące stulecie łamią tę zasadę, a wielokrotności
400z kolei łamią regułę dotyczącą stuleci. Każda wielokrotność400jest również wielokrotnością100i4, więc kolejność sprawdzania decyduje o odpowiedzi.Najpierw sprawdź podzielność przez
400, potem przez100, a następnie przez4i zastosuj pierwszą pasującą regułę. Możesz też połączyć je w jeden warunek: podzielność przez 4 i brak podzielności przez 100 albo podzielność przez 400.
Rozwiązanie
Każda reguła wymaga tylko jednego reszty z dzielenia, więc wystarczą trzy sprawdzenia podzielności. Pułapką jest kolejność: reguły są sprzeczne w przypadku lat takich jak 2000, które są latami setnymi, a zarazem wielokrotnościami 400. Najpierw sprawdź regułę najbardziej szczegółową albo zapisz regułę jako jedno wyrażenie, którego nawiasy utrzymają wyjątki na swoim miejscu.
Sprawdź reguły od najbardziej szczegółowych do najmniej szczegółowych
Intuicja
Te trzy reguły tworzą łańcuch wyjątków. Podzielność przez 4 sprawia, że rok jest przestępny, podzielność przez 100 to odwraca, a podzielność przez 400 odwraca to odwrócenie. Rok spełniający późniejszą regułę zawsze spełnia też wcześniejsze: każda wielokrotność 400 jest wielokrotnością 100, a każda wielokrotność 100 jest wielokrotnością 4.
Odpowiedź zależy więc od najbardziej szczegółowej pasującej reguły. Najpierw sprawdź 400, potem 100, a następnie 4 i zwróć wynik, gdy tylko któraś reguła będzie pasować. W przypadku 2000 już pierwszy test daje wynik „tak”. W przypadku 1900 pierwszy test nie przechodzi, a drugi daje wynik „nie”. W przypadku 2024 dwa pierwsze testy nie przechodzą, a trzeci daje wynik „tak”.
Jeśli żadna z tych trzech reguł nie pasuje, rok w ogóle nie jest podzielny przez 4, więc jest zwykłym rokiem.
Algorytm
- Jeśli
year % 400 == 0, zwróćtrue. - Jeśli
year % 100 == 0, zwróćfalse. - Jeśli
year % 4 == 0, zwróćtrue. - W przeciwnym razie zwróć
false.
def isLeapYear(year):
if year % 400 == 0:
return True
if year % 100 == 0:
return False
if year % 4 == 0:
return True
return FalseJedno wyrażenie logiczne
Intuicja
Odczytaj regułę jako dwa sposoby na to, by rok był przestępny. Rok jest albo podzielny przez 4 i nie jest rokiem stulecia, albo jest podzielny przez 400. To zdanie przekłada się dosłownie na (year % 4 == 0 and year % 100 != 0) or year % 400 == 0.
Sprawdź to na trzech przykładach. 2024 spełnia pierwszą część. 1900 nie spełnia pierwszej części, ponieważ jest rokiem stulecia, i nie spełnia drugiej, ponieważ 1900 % 400 wynosi 300. 2000 nie spełnia pierwszej części z tego samego powodu co 1900 i spełnia drugą.
Możesz też pogrupować to inaczej: rok jest podzielny przez 4 i albo nie jest rokiem stulecia, albo jest wielokrotnością 400. Obie formy dają ten sam wynik dla każdego roku. Wyrażenie wykonuje najwyżej te same trzy sprawdzenia co łańcuch instrukcji if.
Algorytm
- Oblicz
year % 4 == 0 and year % 100 != 0: podzielny przez 4 i niebędący rokiem stulecia. - Oblicz
year % 400 == 0. - Zwróć
true, jeśli zachodzi którykolwiek z warunków.
def isLeapYear(year):
# Every 4th year, except centuries, except every 400th year.
return (year % 4 == 0 and year % 100 != 0) or year % 400 == 0
Pułapki i przypadki brzegowe
Każdy błąd wynika tutaj z potraktowania reguły jako jednego testu zamiast łańcucha wyjątków.
- Sprawdzanie tylko
year % 4 == 0. Daje poprawną odpowiedź dla każdego roku od1901do2099, dlatego błąd pozostaje ukryty, i niepoprawną odpowiedź dla1900i2100. - Sprawdzanie
100przed400w łańcuchu if. Test stulecia zwracafalsedla2000, zanim test400w ogóle zostanie wykonany. - Pominięcie warunku podzielności przez 4.
year % 100 != 0 or year % 400 == 0uznaje2023za rok przestępny, ponieważ2023nie jest rokiem stulecia. - Użycie
year / 4zamiast reszty z dzielenia. Dzielenie informuje, ile razy4mieści się w liczbie; reszta mówi, czy mieści się dokładnie.
Najczęstsze pytania4
Jaka jest zasada dotycząca roku przestępnego?
Rok gregoriański jest rokiem przestępnym, gdy jest podzielny przez 4, chyba że jest podzielny przez 100. Rok podzielny przez 400 i tak jest rokiem przestępnym. Zatem 2024 i 2000 są latami przestępnymi, a 1900 i 2100 nimi nie są.
Dlaczego rok 1900 nie jest przestępny, a 2000 jest?
Oba są latami stulecia, podzielnymi przez 100, co normalnie wyklucza taki rok. 2000 jest również podzielny przez 400, a ta reguła ma pierwszeństwo przed regułą dotyczącą lat stulecia. Przy dzieleniu 1900 przez 400 reszta wynosi 300, więc pozostaje zwykłym rokiem.
Dlaczego istnieją zasady dotyczące lat stulecia?
Rok słoneczny trwa około 365.2422 dnia. Dodawanie jednego dnia co 4 lata daje średnią 365.25, czyli około 3 dni za dużo na każde 400 lat. Pominięcie dnia przestępnego w 3 z każdych 4 lat stuleciowych usuwa te 3 dni. Średnia wynosi wtedy 365.2425 dnia — wystarczająco blisko, by kalendarz pozostawał zgodny z porami roku przez tysiące lat.
Jaka jest złożoność czasowa sprawdzania, czy rok jest przestępny?
Ma złożoność czasową i pamięciową O(1). Sprawdzenie wymaga najwyżej trzech operacji reszty z dzielenia i kilku porównań, niezależnie od wielkości roku.
Podobne zadania
Zadania oparte na tych samych pomysłach. Rozwiązanie dwóch lub trzech utrwala schemat.
Python
def isLeapYear(year):
# Wpisz kod tutajPrzypadek 1
Przypadek 2
Przypadek 3
Wejście
year = 2024
Oczekiwane
true