Il existe plusieurs façons de calculer la somme des chiffres d’un nombre en Python. Nous allons en voir quelques unes, l’intérêt étant de voir les différentes façons d’aborder un même problème.

Première approche pour calculer la somme des chiffres d’un nombre en Python: en utilisant la division euclidienne

L’idée ici est de considérer un nombre n et une variable s devant contenir la somme des chiffres de n. Pour cela, on peut déjà ajouter le chiffre des unités de n, puis transformer n en lui ôtant son chiffre des unités.

Par exemple, si n = 123, s = 3 et n devient n = 12, c’est-à-dire le quotient euclidien de n par 10.

On répète cela à n = 12: s = 3 + 2 = 5 et n devient n = 1.

On termine avec s = 5 + 1 = 6 et n devient n = 0.

Cela donne lieu à cette solution (en prenant l’exemple de n = 5425):

n = 5425
s = 0
while n > 0:
    s += n % 10 # on ajoute à s le chiffre des unités
    n //= 10 # n devient son quotient euclidien par 10
    
print(s)

Deuxième approche pour calculer la somme des chiffres d’un nombre en Python: fonction récursive

On peut s’inspirer de l’approche précédente pour faire sa forme récursive :

def somme(n):
    if n // 10 == 0:
        return n
    else:
        return n % 10 + somme( n // 10 )
    
print( somme (5425) )

Si le nombre mis en argument est inférieur à 10 (donc si son reste dans la division euclidienne par 10 est nul), on retourne sa valeur, sinon on ajoute au reste la valeur retournée par la même fonction donc l’argument n’est plus n mais son quotient euclidien par 10.

La philosophie ici reste la même .

Troisième approche: en transformant le nombre en itérable

C’est sans doute la plus simple des méthodes: on transforme le type du nombre en type itérable (par exemple en str, chaîne de caractères), puis on le parcourt en ajoutant chaque itéré (transformé en nombre entier). Cela donne:

n = 5425
s = 0
for k in str(n):
    s += int(k)
    
print(s)

Quatrième approche: diviser pour régner

C’est une approche répandue quand on a à traiter de gros nombres: on les coupe en deux !

L’idée ici est donc de définir une fonction somme et de couper en deux le nombre. Ensuite, on fait la somme des chiffres des deux nombres formés.

def somme(n):
    if n // 10 == 0:
        return n
    else:
        s = str( n )
        l = len( s ) // 2
        return somme( int( s[:l] ) ) + somme( int(s[l:]) )
>>> somme(458585557565218731015424)
106

Je parle de cette méthode sur la page diviser pour régner de ce site.

Catégories : LaTeX

4.3 3 votes
Évaluation de l'article
S’abonner
Notification pour
guest
1 Commentaire
Le plus ancien
Le plus récent Le plus populaire
Commentaires en ligne
Afficher tous les commentaires
Nicolas Patrois

Une approche avec un itérable créé à la volée :

def somme(n):
  return sum(int(i) for i in str(n))

Encore plus court avec map :

def somme(n):
  return sum(map(int,str(n)))

Et avec une fonction anonyme :

somme=lambda n:sum(map(int,str(n)))
1
0
Nous aimerions avoir votre avis, veuillez laisser un commentaire.x