Écrire compare(s, t) qui, données deux écritures binaires sans zéros…
Exercice d'entraînement · niveau 3 (difficile) · NSI (première), chapitre 1 — Représenter les entiers · Conversions et vérifications
Énoncé
Écrire compare(s, t) qui, données deux écritures binaires sans zéros inutiles à gauche, renvoie , ou selon que le premier nombre est plus petit, égal ou plus grand que le second — sans les convertir en entiers. Valider sur toutes les paires d'entiers inférieurs à .
Corrigé
L'idée. Sans zéros inutiles à gauche, la longueur décide en premier : plus de bits signifie plus grand. À longueur égale, on compare les bits de gauche à droite ; le premier écart tranche, car un bit de poids pèse plus que tous les bits suivants réunis ().
def compare(s, t):
"""-1, 0 ou 1 selon que s est <, = ou > à t.
Précondition : s et t sont des écritures binaires sans
zéros inutiles à gauche (sauf la chaîne "0").
"""
if len(s) != len(t):
return -1 if len(s) < len(t) else 1
for i in range(len(s)):
if s[i] != t[i]:
return -1 if s[i] == "0" else 1
return 0
Validation.
for x in range(0, 200):
for y in range(0, 200):
attendu = (x > y) - (x < y)
assert compare(vers_base(x, 2), vers_base(y, 2)) == attendu
cas passent.
Piège : oublier la précondition. Avec "0011" et "11", la fonction répondrait « le premier est plus grand » alors qu'ils sont égaux : c'est la comparaison des longueurs qui devient fausse dès qu'on autorise les zéros de tête.
Les autres exercices de ce chapitre Le cours du chapitre
Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.