Adloun

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

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.