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 :
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
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 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...
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)
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 :
Est-ce qu'il y a plus simple tout étant aussi/plus rapide ?
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
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
Partager