Solution de Conversion en binaire - Sujet 38 - EP NSI 2025
Énoncé du problème
Exercice 1
Écrire une fonction moyenne qui prend en paramètre un tableau non vide de nombres flottants et qui renvoie la moyenne des valeurs du tableau. Les tableaux seront représentés sous forme de liste Python.
Exemples :
>>> moyenne([1.0])
1.0
>>> moyenne([1.0, 2.0, 4.0])
2.3333333333333335
Exercice 2
On considère la fonction binaire à la page suivante. Cette fonction prend en paramètre un entier positif a en écriture décimale et renvoie son écriture binaire sous la forme d’une chaine de caractères.
L’algorithme utilise la méthode des divisions euclidiennes successives comme l’illustre l’exemple ci-après.
[Figure : potence de divisions euclidiennes successives par 2 du nombre 201 : 201 divisé par 2 donne 100 reste 1 ; 100 divisé par 2 donne 50 reste 0 ; 50 divisé par 2 donne 25 reste 0 ; 25 divisé par 2 donne 12 reste 1 ; 12 divisé par 2 donne 6 reste 0 ; 6 divisé par 2 donne 3 reste 0 ; 3 divisé par 2 donne 1 reste 1 ; 1 divisé par 2 donne 0 reste 1. Une flèche parcourt les restes du dernier au premier. Légende : 201 s’écrit 1100 1001₂.]
Compléter le code de la fonction binaire.
def binaire(a):
'''convertit un nombre entier a en sa representation
binaire sous forme de chaine de caractères.'''
if a == 0:
return ...
bin_a = ...
while ... :
bin_a = ... + bin_a
a = ...
return bin_a
Exemples :
>>> binaire(83)
'1010011'
>>> binaire(6)
'110'
>>> binaire(127)
'1111111'
>>> binaire(0)
'0'
Les contraintes ci-dessous sont ajoutées par la plateforme et ne font pas partie du sujet.
Exercice 1
Contraintes :
tabest une liste Python non vide :1 <= len(tab) <= 10^4tab[i]est un nombre flottant (float) pour touti-10^6 <= tab[i] <= 10^6- La valeur renvoyée est un
float: la moyenne des valeurs du tableau, obtenue en ajoutant les valeurs une à une dans l’ordre du tableau, puis en divisant une seule fois par le nombre de valeurs
Exercice 2
Contraintes :
aest un entier (int) avec0 <= a <= 10^9(le casa = 0est inclus)- La valeur renvoyée est une chaine de caractères (
str) composée uniquement des caractères0et1 - L’écriture renvoyée ne comporte pas de zéro initial, sauf pour
a = 0qui donne'0'
Solution
Solution - Sujet 38
Exercice 1 - moyenne
L’idée. La moyenne, c’est la somme de toutes les valeurs divisée par leur nombre. On part donc d’un total à zéro, on parcourt le tableau en ajoutant chaque valeur à ce total, et une fois la boucle terminée on divise ce total par le nombre de valeurs. Le tableau est non vide, on n’a donc pas à se demander quoi faire quand il n’y a rien à diviser.
Un petit exemple. Pour [1.0, 2.0, 4.0] : le total vaut d’abord 1.0, puis 3.0, puis 7.0. Il y a 3 valeurs, donc on renvoie 7.0 / 3, soit 2.3333333333333335.
def moyenne(tab):
total = 0.0
for valeur in tab:
total = total + valeur
# La division se fait une seule fois, après la boucle, sur le total complet
return total / len(tab)
total accumule la somme des valeurs déjà parcourues ; à la sortie de la boucle il contient la somme de tout le tableau. len(tab) donne le nombre de valeurs. L’erreur classique est de placer la division à l’intérieur de la boucle : il faut d’abord tout additionner, et diviser seulement à la fin.
Exercice 2 - binaire
L’idée. On divise le nombre par 2 encore et encore, et on note le reste de chaque division. Ces restes valent 0 ou 1 : ce sont exactement les chiffres binaires. Mais ils apparaissent dans le mauvais ordre, car le premier reste trouvé est le chiffre le plus à droite. C’est pour cela qu’on colle chaque nouveau reste devant la chaîne déjà construite. On s’arrête quand le nombre est tombé à 0. Le cas a == 0 est traité à part : sinon la boucle ne tournerait aucune fois et on renverrait une chaîne vide au lieu de '0'.
Un petit exemple. Pour a = 6 : 6 = 2 x 3 + 0, on écrit '0' ; puis 3 = 2 x 1 + 1, on écrit '1' devant, ce qui donne '10' ; puis 1 = 2 x 0 + 1, on écrit '1' devant, ce qui donne '110'. Maintenant a vaut 0, la boucle s’arrête et on renvoie '110'.
def binaire(a):
'''convertit un nombre entier a en sa representation
binaire sous forme de chaine de caractères.'''
if a == 0:
return '0'
bin_a = ''
while a > 0:
# Le reste est le chiffre de poids le plus faible : il se place devant les autres
bin_a = str(a % 2) + bin_a
a = a // 2
return bin_a
bin_a contient l’écriture binaire en cours de construction ; elle part de la chaîne vide ''. À chaque tour, a % 2 donne le reste de la division par 2 (donc 0 ou 1) et a // 2 donne le quotient, c’est-à-dire le nombre sur lequel on continue. Comme a est divisé par 2 à chaque tour, il finit toujours par atteindre 0 : la boucle se termine bien. Attention à l’ordre dans str(a % 2) + bin_a : en écrivant bin_a + str(a % 2), on obtiendrait les chiffres à l’envers.