Aller au contenu

Années bissextiles⚓︎

Les années bissextiles comportent 366 jours. Contrairement à ce que l'on pense couramment, elles ne se rencontrent pas exactement tous les 4 ans !

En effet :

  • une année non divisible par 4 n'est pas bissextile,
  • parmi les années divisibles par 4 :
    • les années qui ne sont pas divisibles par 100 sont bissextiles,
    • parmi les années divisibles par 100 :
      • les années qui ne sont pas divisibles par 400 ne sont pas bissextiles,
      • les autres sont bissextiles.
graph LR
    A{annee est div. par 4 ?} -->|Non| B[Non bissextile]
    A --->|Oui| C{annee NON div. par 100 ?}
    C -->|Oui| D[Bissextile]
    C ---> |Non| E{annee est div. par 400 ?}
    E --> |Non| F[Non bissextile]
    E --> |Oui| G[Bissextile]

Par exemple :

  • 2022 n'est pas divisible par 4 : elle n'est pas bissextile ;
  • 2020 est divisible par 4, mais pas par 100 : elle est bissextile ;
  • 2100 est divisible par 4, par 100, mais pas par 400 : elle n'est pas bissextile ;
  • 2400 est divisible par 4, par 100 et par 400 : elle est bissextile.
Aide - Tester la divisibilité avec Python

Avec Python, il est possible de tester la divisibilité de a par b en utilisant l'opérateur "modulo" % qui renvoie le reste de la division euclidienne de a par b.

Si ce reste vaut 0 alors a est divisible par b. Dans le cas contraire, a n'est pas divisible par b.

🐍 Console Python
>>> # 15 est-il divisible par 3 ? -> Oui
>>> 15 % 3 == 0
True
>>> # 500 est-il divisible par 7 ? -> Non
>>> 500 % 7 == 0
False
>>> # 500 est-il NON divisible par 7 ? -> Oui
>>> 500 % 7 != 0
True

Compléter la fonction est_bissextile ci-dessous renvoyant True si l'année passée en argument est bissextile, False dans le cas contraire.

Exemples

🐍 Console Python
>>> est_bissextile(2022)
False
>>> est_bissextile(2020)
True
>>> est_bissextile(2100)
False
>>> est_bissextile(2400)
True
###
# Testsbksl-nlassert estpy-undbissextile(2022) == Falsebksl-nlassert estpy-undbissextile(2020) == Truebksl-nlassert estpy-undbissextile(2100) == Falsebksl-nlassert estpy-undbissextile(2400) == Truebksl-nlbksl-nl# Tests supplémentairesbksl-nlfor annee in range(1001):bksl-nl assert estpy-undbissextile(annee) == (bksl-nl (annee % 4 == 0 and annee % 100 != 0) or annee % 400 == 0bksl-nl )bksl-nlbksl-nl 5/5

def estpy-undbissextile(annee):bksl-nl ...bksl-nlbksl-nl# Testsbksl-nlassert estpy-undbissextile(2022) == Falsebksl-nlassert estpy-undbissextile(2020) == Truebksl-nlassert estpy-undbissextile(2100) == Falsebksl-nlassert estpy-undbissextile(2400) == Truebksl-nldef estpy-undbissextile(annee):bksl-nl if annee % 4 != 0:bksl-nl return Falsebksl-nl if annee % 100 != 0:bksl-nl return Truebksl-nl if annee % 400 != 0:bksl-nl return Falsebksl-nl return Truebksl-nlbksl-nlbksl-nl# Testsbksl-nlassert estpy-undbissextile(2022) == Falsebksl-nlassert estpy-undbissextile(2020) == Truebksl-nlassert estpy-undbissextile(2100) == Falsebksl-nlassert estpy-undbissextile(2400) == Truebksl-nlbksl-nl

A

Si l'on applique la règle telle qu'elle est formulée dans l'énoncé on obtient :

🐍 Script Python
def est_bissextile(annee):
    if annee % 4 != 0:      # année non div. par 4
        return False            
    else:                   # année div. par 4
        if annee % 100 != 0:    # année non div. par 100 
            return True
        else:                   # année div. par 100
            if annee % 400 != 0:    # année non div. par 400
                return False
            else:                   # année div. par 400 
                return True

Il est aussi possible de structurer le code avec des elif :

🐍 Script Python
def est_bissextile(annee):
    if annee % 4 != 0:      # année non div. par 4
        return False            
    elif annee % 100 != 0: # année div. par 4
                           # et pas par 100 
        return True
    elif annee % 400 != 0: # année div. par 4
                           # et par 100
                           # mais pas par 400
        return False
    else: # année div. par 4
          # et par 100
          # mais pas par 400
        return True

En utilisant plusieurs return, on peut obtenir un code plus lisible :

On peut aussi répondre en une ligne :

🐍 Script Python
def est_bissextile(annee):
    return (annee % 4 == 0 and annee % 100 != 0) or annee % 400 == 0

Z