Leap Year
Ricevi un anno year del calendario gregoriano. Restituisci true se è un anno bisestile, cioè un anno che ha il 29 febbraio, e false altrimenti.
Un anno è bisestile quando è divisibile per 4, tranne gli anni divisibili per 100, che non sono bisestili a meno che non siano divisibili anche per 400.
Funzione
- yearinteger
- l'anno da controllare
- Restituisceboolean
- vero quando l'anno ha un 29 febbraio, falso altrimenti
Vincoli
1 ≤ year ≤ 106
Esempi
- Input
- year = 2024
- Output
- true
- Spiegazione
2024è divisibile per4e non è un anno secolare, quindi è un anno bisestile.
- Input
- year = 1900
- Output
- false
- Spiegazione
1900è divisibile per4, ma è divisibile anche per100e non per400, quindi si applica l’eccezione dei secoli e non è un anno bisestile.
- Input
- year = 2000
- Output
- true
- Spiegazione
2000è divisibile per100, il che lo escluderebbe, ma è anche divisibile per400, il che lo rende nuovamente idoneo. È un anno bisestile.
+16 test nascosti all’invio
Suggerimenti
Aprili uno alla volta. Ognuno rivela un po’ di più.
Un resto di
0dopo la divisione per4è la prima regola. Quali anni non la rispettano?Gli anni secolari fanno eccezione, e i multipli di
400fanno a loro volta eccezione alla regola dei secoli. Ogni multiplo di400è anche un multiplo di100e di4, quindi l’ordine dei controlli determina la risposta.Controlla prima la divisibilità per
400, poi per100, poi per4, e lascia che sia la prima regola che corrisponde a determinare il risultato. Oppure combina le condizioni: divisibile per 4 e non per 100, oppure divisibile per 400.
Soluzione
Ogni regola richiede un solo resto, quindi il lavoro consiste in tre verifiche di divisibilità. La trappola è l’ordine: le regole si contraddicono per anni come 2000, che è un secolo e anche un multiplo di 400. Verifica prima la regola più specifica oppure scrivi la regola come un’unica espressione, usando le parentesi per mantenere le eccezioni al posto giusto.
Controlla le regole dalla più specifica alla meno specifica
Intuizione
Le tre regole formano una catena di eccezioni. La divisibilità per 4 rende bisestile un anno, la divisibilità per 100 annulla questo effetto e la divisibilità per 400 annulla l’annullamento. Un anno che corrisponde a una regola successiva corrisponde sempre anche a quelle precedenti: ogni multiplo di 400 è un multiplo di 100 e ogni multiplo di 100 è un multiplo di 4.
Quindi, a determinare la risposta è la regola più specifica che corrisponde. Verifica prima 400, poi 100, poi 4 e restituisci il risultato non appena una corrisponde. Per 2000 il primo controllo dà già esito positivo. Per 1900 il primo controllo fallisce e il secondo dà esito negativo. Per 2024 i primi due controlli falliscono e il terzo dà esito positivo.
Se nessuna delle tre corrisponde, l’anno non è divisibile per 4, quindi è un anno comune.
Algoritmo
- Se
year % 400 == 0, restituiscitrue. - Se
year % 100 == 0, restituiscifalse. - Se
year % 4 == 0, restituiscitrue. - Altrimenti restituisci
false.
def isLeapYear(year):
if year % 400 == 0:
return True
if year % 100 == 0:
return False
if year % 4 == 0:
return True
return FalseUn'espressione booleana
Intuizione
Leggi la regola come due modi per essere un anno bisestile. L’anno è divisibile per 4 e non è un secolo, oppure è divisibile per 400. Questa frase si traduce parola per parola in (year % 4 == 0 and year % 100 != 0) or year % 400 == 0.
Verificala con i tre esempi. 2024 soddisfa la prima parte. 1900 non soddisfa la prima parte perché è un secolo, e non soddisfa la seconda perché 1900 % 400 è 300. 2000 non soddisfa la prima parte per lo stesso motivo di 1900, e soddisfa la seconda.
Puoi anche raggrupparla nell’altro modo: divisibile per 4, e o non è un secolo o è un multiplo di 400. Le due forme concordano per ogni anno. L’espressione esegue al massimo gli stessi tre controlli della catena di if.
Algoritmo
- Calcola
year % 4 == 0 and year % 100 != 0: divisibile per 4 e non un secolo. - Calcola
year % 400 == 0. - Restituisci
truese una delle due condizioni è vera.
def isLeapYear(year):
# Every 4th year, except centuries, except every 400th year.
return (year % 4 == 0 and year % 100 != 0) or year % 400 == 0
Trappole e casi limite
Ogni errore qui deriva dal considerare la regola come un unico test anziché come una catena di eccezioni.
- Controllare solo
year % 4 == 0. Fornisce la risposta corretta per ogni anno dal1901al2099, motivo per cui il bug passa inosservato, e la risposta sbagliata per1900e2100. - Verificare
100prima di400in una catena di if. Il test del secolo restituiscefalseper2000prima ancora che venga eseguito il test di400. - Omettere la parte della divisibilità per 4.
year % 100 != 0 or year % 400 == 0considera2023un anno bisestile, perché2023non è un secolo. - Usare
year / 4quando intendevi il resto. La divisione ti dice quante volte4ci sta; il resto ti dice se ci sta esattamente.
Domande frequenti4
Qual è la regola per un anno bisestile?
Un anno gregoriano è bisestile quando è divisibile per 4, a meno che non sia divisibile per 100. Un anno divisibile per 400 è comunque bisestile. Quindi 2024 e 2000 sono bisestili, mentre 1900 e 2100 non lo sono.
Perché il 1900 non è un anno bisestile, ma il 2000 sì?
Entrambi sono anni secolari, divisibili per 100, il che normalmente esclude un anno. 2000 è divisibile anche per 400, e questa regola prevale su quella degli anni secolari. 1900 lascia un resto di 300 quando viene diviso per 400, quindi rimane un anno comune.
Perché esistono le regole dei secoli?
Un anno solare dura circa 365.2422 giorni. Aggiungere un giorno ogni 4 anni dà una media di 365.25, ovvero circa 3 giorni di troppo ogni 400 anni. Saltare il giorno bisestile in 3 anni secolari su 4 elimina quei 3 giorni. La media diventa 365.2425 giorni, abbastanza vicina da mantenere il calendario in sincronia con le stagioni per migliaia di anni.
Qual è la complessità temporale della verifica di un anno bisestile?
È O(1) in termini di tempo e spazio. Il controllo richiede al massimo tre operazioni di resto e pochi confronti, indipendentemente dalla grandezza dell’anno.
Problemi simili
Problemi che usano le stesse idee. Risolverne due o tre è ciò che fissa uno schema.
Python
def isLeapYear(year):
# Scrivi il codice quiCaso 1
Caso 2
Caso 3
Input
year = 2024
Atteso
true