107 votes

Additionner les chiffres d'un nombre

Si je veux trouver la somme des chiffres d'un nombre, par exemple :

  • Entrée : 932
  • Sortie : 14 qui est (9 + 3 + 2)

Quel est le moyen le plus rapide de le faire ?

Je l'ai fait instinctivement :

sum(int(digit) for digit in str(number))

et j'ai trouvé ça en ligne :

sum(map(int, str(number)))

Quelle est la meilleure méthode à utiliser pour la rapidité, et existe-t-il d'autres méthodes encore plus rapides ?

3voto

TUSqasi Points 182

Le meilleur moyen est d'utiliser les mathématiques.
Je l'ai appris à l'école (et aussi dans Codewars).

def digital_sum(num):
    return (num % 9) or num and 9

Je ne sais pas comment ça marche en code, mais je sais que c'est des maths.

Si un nombre est divisible par 9, sa somme numérique sera de 9,
si ce n'est pas le cas, alors num % 9 sera la somme numérique.

1voto

wim Points 35274

Le fait qu'il soit plus rapide de travailler avec des mathématiques ou des chaînes de caractères dépend ici de la taille du nombre d'entrée.

Pour les petits nombres, utilisez les mathématiques (division et modulus) :

def sum_digits_math(n):
    r = 0
    while n:
        r, n = r + n % 10, n // 10
    return r

Pour les grands nombres, utilisez le domaine de la chaîne de caractères :

def sum_digits_str_dumb(n):
    """from OP https://stackoverflow.com/q/14939953/674039"""
    return sum(int(i) for i in str(n))

def sum_digits_str_fast(n):
    d = str(n)
    return sum(int(s) * d.count(s) for s in "123456789")

Le point d'intersection, où l'utilisation de la division et du module commence à perdre du terrain par rapport au travail dans le domaine des chaînes de caractères, se situe à des nombres d'environ 27 chiffres (là où la ligne bleue croise la ligne rouge dans le graphique ci-dessous) :

profile1

Le profil de performance pour l'utilisation des mathématiques se dégrade au fur et à mesure que le nombre d'entrée est plus grand, mais le domaine des chaînes de caractères semble évoluer linéairement en fonction de la longueur de l'entrée. Le code qui a été utilisé pour générer ces graphiques est le suivant aquí J'utilise CPython 3.10.2 sur macOS.

0voto

praveen nani Points 69

Essayez ceci

    print(sum(list(map(int,input("Enter your number ")))))

0voto

Khizar Anjum Points 9

Voici une solution sans boucle ni récursion mais qui ne fonctionne que pour les entiers non négatifs (Python3) :

def sum_digits(n):
    if n > 0:
        s = (n-1) // 9    
        return n-9*s
    return 0

0voto

snakecharmerb Points 8425

Un nombre en base 10 peut être exprimé sous forme de série de la forme

a × 10^ p + b × 10^ p-1 .. z × 10^ 0

donc la somme des chiffres d'un nombre est la somme des coefficients des termes.

Sur la base de ces informations, la somme des chiffres peut être calculée comme suit :

import math

def add_digits(n):
    # Assume n >= 0, else we should take abs(n)
    if 0 <= n < 10:
        return n
    r = 0
    ndigits = int(math.log10(n))
    for p in range(ndigits, -1, -1):
        d, n = divmod(n, 10 ** p)
        r += d
    return r

C'est effectivement l'inverse de la division continue par 10 dans la réponse acceptée. Étant donné le calcul supplémentaire dans cette fonction par rapport à la réponse acceptée, il n'est pas surprenant de constater que cette approche est peu performante en comparaison : elle est environ 3,5 fois plus lente, et environ deux fois plus lente que la fonction de division par 10.

sum(int(x) for x in str(n))

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X