Salut,

1- Comment coderiez-vous une fonction qui calcule le nombre d'années bissextiles entre deux années a1 et a2 (non inclus) ?

Bon voici une solution avec une boucle :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
def is_bissextile(annee):
    return annee % 4 == 0 and annee % 100 != 0 or annee % 400 == 0
 
# Fonction avec une boucle
def nbr_annees_bissextiles1(a1, a2):
    nbr_annees_bissextiles = 0
    for a in range(a1, a2):
        if is_bissextile(a):
            nbr_annees_bissextiles += 1
    return nbr_annees_bissextiles
Mais une solution avec une formule serait plus rapide je pense... Et justement j'ai trouvé cette formule* :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
diff = a2 - a1    
nbr_annees_bissextiles = math.trunc(diff / 4) - math.trunc(diff / 100) + math.trunc(diff / 400)
Mais après quelques testes je me suis rendu compte que parfois elle donne un résultat erroné, dans ces cas-là il manque une année...

Je pense que l'erreur vient de la partie math.trunc(diff / 4), tout va bien si le reste de la division vaut 0 mais sinon dans certains cas il faut compenser en ajoutant une année.

Le tout étant de trouver la condition permettant de repérer ces cas, j'en ai trouvé une (cf. le code ci-dessous) qui semble fonctionner mais elle me semble compliquée, je me demande si il n'y a pas plus simple...

Voici le code :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def is_bissextile(annee):
    return annee % 4 == 0 and annee % 100 != 0 or annee % 400 == 0
 
# Fonction sans boucle...
def nbr_annees_bissextiles(a1, a2):
    diff = a2 - a1
    reste = diff % 4
    nbr_annees_bissextiles = diff // 4 - diff // 100 + diff // 400
 
    condition = reste != 0 and (is_bissextile(a1) or reste >= 2 and is_bissextile(
        a1 + 1) or reste == 3 and is_bissextile(a1 + 2))
 
    if condition:
        nbr_annees_bissextiles += 1
 
    return nbr_annees_bissextiles
Est-ce qu'il y a plus simple tout étant aussi/plus rapide ?


2- Comment coderiez-vous une fonction qui donne la liste des années bissextiles entre deux années a1 et a2 (non inclus) ?



* En python pas besoin de la fonction math.trunc :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
diff = a2 - a1    
nbr_annees_bissextiles = diff // 4 - diff // 100 + diff // 400