Solution de Conversion en binaire - Sujet 38 - EP NSI 2025

Moyen Officiel
Python (3.14.0)

É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 :

  • tab est une liste Python non vide : 1 <= len(tab) <= 10^4
  • tab[i] est un nombre flottant (float) pour tout i
  • -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 :

  • a est un entier (int) avec 0 <= a <= 10^9 (le cas a = 0 est inclus)
  • La valeur renvoyée est une chaine de caractères (str) composée uniquement des caractères 0 et 1
  • L’écriture renvoyée ne comporte pas de zéro initial, sauf pour a = 0 qui 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.