Leap Year
On te donne une année year du calendrier grégorien. Retourne true si c’est une année bissextile, c’est-à-dire une année qui compte un 29 février, et false sinon.
Une année est bissextile lorsqu’elle est divisible par 4, sauf les années divisibles par 100, qui ne sont pas bissextiles à moins qu’elles ne soient également divisibles par 400.
Fonction
- yearinteger
- l’année à vérifier
- Renvoieboolean
- vrai lorsque l’année comporte un 29 février, faux sinon
Contraintes
1 ≤ year ≤ 106
Exemples
- Entrée
- year = 2024
- Sortie
- true
- Explication
2024est divisible par4et n’est pas une année séculaire, donc c’est une année bissextile.
- Entrée
- year = 1900
- Sortie
- false
- Explication
1900est divisible par4, mais il est également divisible par100et ne l’est pas par400; l’exception des années séculaires s’applique donc, et ce n’est pas une année bissextile.
- Entrée
- year = 2000
- Sortie
- true
- Explication
2000est divisible par100, ce qui l’exclurait, mais il est également divisible par400, ce qui le réintègre. C’est une année bissextile.
+16 tests cachés à la soumission
Indices
Ouvrez-les un par un. Chacun en dévoile un peu plus.
Un reste de
0après une division par4est la première règle. Quelles années ne la respectent pas ?Les années séculaires y font exception, et les multiples de
400font à leur tour exception à la règle des années séculaires. Chaque multiple de400est également un multiple de100et de4, donc l’ordre de vos vérifications détermine la réponse.Vérifie d’abord la divisibilité par
400, puis par100, puis par4, et laisse la première règle qui correspond décider. Ou combine-les : divisible par 4 et non par 100, ou divisible par 400.
Solution
Chaque règle nécessite un seul reste, donc le travail consiste en trois tests de divisibilité. Le piège, c’est l’ordre : les règles se contredisent pour des années comme 2000, qui est un siècle et aussi un multiple de 400. Teste d’abord la règle la plus spécifique, ou écris la règle sous la forme d’une seule expression dont les parenthèses maintiennent les exceptions à leur place.
Vérifiez les règles de la plus spécifique à la moins spécifique
Intuition
Les trois règles forment une chaîne d’exceptions. La divisibilité par 4 rend une année bissextile, la divisibilité par 100 annule cela, et la divisibilité par 400 annule cette annulation. Une année qui correspond à une règle ultérieure correspond toujours aussi aux règles précédentes : tout multiple de 400 est un multiple de 100, et tout multiple de 100 est un multiple de 4.
La règle la plus spécifique qui correspond détermine donc la réponse. Testez d’abord 400, puis 100, puis 4, et renvoyez le résultat dès qu’une règle correspond. Pour 2000, le premier test indique déjà oui. Pour 1900, le premier test échoue et le deuxième indique non. Pour 2024, les deux premiers tests échouent et le troisième indique oui.
Si aucune des trois ne correspond, l’année n’est pas du tout divisible par 4, donc c’est une année ordinaire.
Algorithme
- Si
year % 400 == 0, renvoietrue. - Si
year % 100 == 0, renvoiefalse. - Si
year % 4 == 0, renvoietrue. - Sinon, renvoie
false.
def isLeapYear(year):
if year % 400 == 0:
return True
if year % 100 == 0:
return False
if year % 4 == 0:
return True
return FalseUne expression booléenne
Intuition
Lisez la règle comme deux façons d’être une année bissextile. Soit l’année est divisible par 4 et n’est pas une année séculaire, soit elle est divisible par 400. Cette phrase se traduit mot pour mot par (year % 4 == 0 and year % 100 != 0) or year % 400 == 0.
Vérifiez-la avec les trois exemples. 2024 satisfait la première moitié. 1900 échoue à la première moitié parce que c’est une année séculaire, et échoue à la seconde parce que 1900 % 400 vaut 300. 2000 échoue à la première moitié pour la même raison que 1900, et satisfait la seconde.
Vous pouvez aussi regrouper la règle autrement : divisible par 4, et soit pas une année séculaire, soit un multiple de 400. Les deux formes donnent le même résultat pour chaque année. L’expression effectue au plus les mêmes trois vérifications que la chaîne de if.
Algorithme
- Calcule
year % 4 == 0 and year % 100 != 0: divisible par 4 et pas une année séculaire. - Calcule
year % 400 == 0. - Renvoie
truesi l’une ou l’autre condition est satisfaite.
def isLeapYear(year):
# Every 4th year, except centuries, except every 400th year.
return (year % 4 == 0 and year % 100 != 0) or year % 400 == 0
Pièges et cas limites
Chaque erreur ici vient du fait de traiter la règle comme un seul test au lieu d’une chaîne d’exceptions.
- Vérifier uniquement
year % 4 == 0. Cela donne la bonne réponse pour chaque année de1901à2099, ce qui explique pourquoi le bogue passe inaperçu, et la mauvaise réponse pour1900et2100. - Tester
100avant400dans une chaîne de if. Le test du siècle renvoiefalsepour2000avant même que le test de400ne s’exécute. - Omettre la partie « divisible par 4 ».
year % 100 != 0 or year % 400 == 0considère2023comme une année bissextile, parce que2023n’est pas une année séculaire. - Utiliser
year / 4alors que vous vouliez le reste. La division indique combien de fois4peut être contenu ; le reste indique si la division tombe juste.
Questions fréquentes4
Quelle est la règle pour une année bissextile ?
Une année grégorienne est une année bissextile lorsqu’elle est divisible par 4, sauf si elle est divisible par 100. Une année divisible par 400 est tout de même une année bissextile. Ainsi, 2024 et 2000 sont des années bissextiles, tandis que 1900 et 2100 ne le sont pas.
Pourquoi 1900 n’est-elle pas une année bissextile, alors que 2000 l’est ?
Les deux sont des années séculaires, divisibles par 100, ce qui exclut normalement une année. 2000 est également divisible par 400, et cette règle l’emporte sur la règle des années séculaires. 1900 laisse un reste de 300 lorsqu’on le divise par 400, il reste donc une année ordinaire.
Pourquoi les règles du siècle existent-elles ?
Une année solaire dure environ 365.2422 jours. Ajouter un jour tous les 4 ans donne une moyenne de 365.25, soit environ 3 jours de trop tous les 400 ans. Supprimer le jour bissextile lors de 3 années séculaires sur 4 élimine ces 3 jours. La moyenne devient 365.2425 jours, ce qui suffit pour que le calendrier reste en phase avec les saisons pendant des milliers d’années.
Quelle est la complexité temporelle de la vérification d’une année bissextile ?
C’est O(1) en temps et en espace. La vérification nécessite au maximum trois opérations de reste et quelques comparaisons, quelle que soit la taille de l’année.
Problèmes similaires
Des problèmes qui reposent sur les mêmes idées. En résoudre deux ou trois, c’est ce qui ancre un schéma.
Python
def isLeapYear(year):
# Écrivez le code iciCas 1
Cas 2
Cas 3
Entrée
year = 2024
Attendu
true