Écrire nombre de chiffres(n) pour, sans passer par str
Exercice d'entraînement · niveau 2 · NSI (première), chapitre 3 — Langages et programmation · Écrire et spécifier ses propres fonctions
Énoncé
Écrire nombre_de_chiffres(n) pour , sans passer par str. Justifier la terminaison, puis expliquer pourquoi le cas exige un traitement séparé alors que le cas de somme_des_chiffres n'en exigeait pas.
Corrigé
def nombre_de_chiffres(n):
"""Nombre de chiffres de l'ecriture decimale de n.
Precondition : n est un entier >= 0.
Postcondition : le resultat k verifie 10**(k-1) <= n < 10**k pour n >= 1,
et vaut 1 pour n = 0.
"""
assert n >= 0
if n == 0:
return 1
k = 0
while n > 0:
n = n // 10
k = k + 1
return k
La terminaison. Variant : . Il est entier positif et strictement décroissant tant que (une division entière par d'un entier donne un entier strictement plus petit). Donc la boucle s'arrête.
Pourquoi est différent ici. La question porte sur la valeur de l'accumulateur quand la boucle ne tourne pas :
- pour la somme des chiffres, l'accumulateur vaut , et la bonne réponse est : elles coïncident, aucun cas particulier n'est nécessaire ;
- pour le nombre de chiffres, l'accumulateur vaut , mais la bonne réponse est — car s'écrit avec un chiffre, le chiffre . Elles ne coïncident pas : il faut le dire explicitement.
Un cas particulier n'est pas une faiblesse du code, c'est une propriété du problème. La même remarque valait pour nb_bits au chapitre 1.
La vérification.
for n in range(0, 20000):
assert nombre_de_chiffres(n) == len(str(n))
Les cas passent. Contrôles : , , , — les deux derniers encadrent le changement de longueur.
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.