Somme des chiffres pour un nombre en écriture décimale⚓︎
On veut calculer la somme des chiffres d'un nombre en écriture décimale. Ce genre d'opération est effectué de manière naturelle en primaire pour déterminer si un nombre est un multiple de 3 ou de 9 : on fait la somme de ses chiffres, et on regarde si cette somme est elle-même un multiple de 3 ou de 9.
En revanche, là où il est très facile pour un humain de savoir quels chiffres composent un nombre, cette décomposition ne va pas de soi pour un ordinateur. Cet exercice réalise cette opération en deux étapes :
- une première étape où on décompose un nombre : on compte le nombre d'occurrences de chacun de ses chiffres et on stocke ce résultat dans un tableau d'effectifs ; c'est-à-dire un tableau où chaque indice de \(0\) à \(9\) représente un chiffre et la valeur associée est le nombre d'occurrences de ce chiffre dans le nombre
- une deuxième étape où on prend un tel tableau et on calcule la somme des chiffres associée.
L'étape 1 est réalisée par la fonction decomposition
et l'étape 2 par la fonction somme_chiffres
.
Exemple
Ainsi le nombre \(222270\) a pour tableaux d'effectifs [1, 0, 4, 0, 0, 0, 0, 1, 0, 0]
et pour somme des chiffres
>>> decomposition(222270)
[1, 0, 4, 0, 0, 0, 0, 1, 0, 0]
>>> somme_chiffres([1, 0, 4, 0, 0, 0, 0, 1, 0, 0])
15
Question 1⚓︎
Compléter la fonction somme_chiffres
qui prend en argument un tableau d'occurrences de chiffres effectif_chiffres
, comme décrit en introduction et qui renvoie la somme des chiffres ainsi comptés.
Exemples
>>> somme_chiffres([1, 1, 1, 1, 1, 1, 1, 1, 1, 1])
45
>>> somme_chiffres([0, 0, 0, 0, 0, 0, 0, 0, 0, 1])
9
>>> somme_chiffres([0, 9, 0, 0, 0, 0, 0, 0, 0, 0])
9
Question 2⚓︎
Compléter la fonction decomposition
qui prend en argument un nombre entier positif nombre
et qui renvoie le tableau effectifs
tel que décrit en introduction.
Rappels
-
L'opérateur
//
renvoie le résultat de la division euclidienne (par exemple,13//4
renvoie la valeur3
). -
L'opérateur
%
en python renvoie le reste de la division euclidienne (par exemple,13%4
renvoie la valeur1
).
Exemples
>>> decomposition(342424)
[0, 0, 2, 1, 3, 0, 0, 0, 0, 0]
>>> decomposition(10111213141516171819)
[1, 11, 1, 1, 1, 1, 1, 1, 1, 1]
>>> decomposition(1234567890)
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
>>> decomposition(1337 ** 42)
[18, 13, 15, 8, 14, 9, 12, 8, 16, 19]
#Exercice 1bksl-nldef sommepy-undchiffres(effectifspy-undchiffres):bksl-nl ...bksl-nlbksl-nlbksl-nl# Exercice 2bksl-nldef decomposition(nombre):bksl-nl effectifspy-undchiffres = [0] py-str ...bksl-nl while nombre != ...:bksl-nl nombre, unite = ...bksl-nl effectifspy-undchiffres[...] = effectifspy-undchiffres[...] + 1bksl-nl return ...bksl-nlbksl-nldef sommepy-undchiffres(effectifspy-undchiffres):bksl-nl # assert len(effectifspy-undchiffres) == 10, Le tableau doit être de taille 10bksl-nl resultat = 0bksl-nl for i in range(10):bksl-nl resultat = resultat + effectifspy-undchiffres[i] py-str ibksl-nl return resultatbksl-nlbksl-nldef decomposition(nombre):bksl-nl effectifspy-undchiffres = [0] py-str 10bksl-nl while nombre != 0:bksl-nl nombre, unite = nombre // 10, nombre % 10bksl-nl effectifspy-undchiffres[unite] = effectifspy-undchiffres[unite] + 1bksl-nl return effectifspy-undchiffresbksl-nlbksl-nlbksl-nl
A
Autre version légèrement plus synthétique :
def somme_chiffres(effectifs_chiffres):
resultat = 0
for chiffre, effectif in enumerate(effectifs_chiffres):
resultat += chiffre * effectif
return resultat
def decomposition(nombre):
effectifs_chiffres = [0] * 10
while nombre != 0:
nombre, unite = divmod(nombre, 10)
effectifs_chiffres[unite] += 1
return effectifs_chiffres
Z