Saltar al contenido

Sumar los dígitos de un número

Intenta comprender el código de forma correcta previamente a aplicarlo a tu proyecto y si tdeseas aportar algo puedes decirlo en los comentarios.

Solución:

Ambas líneas que publicaste están bien, pero puedes hacerlo puramente en números enteros, y será lo más eficiente:

def sum_digits(n):
    s = 0
    while n:
        s += n % 10
        n //= 10
    return s

o con divmod:

def sum_digits2(n):
    s = 0
    while n:
        n, remainder = divmod(n, 10)
        s += remainder
    return s

Aún más rápida es la versión sin asignaciones aumentadas:

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

> %timeit sum_digits(n)
1000000 loops, best of 3: 574 ns per loop

> %timeit sum_digits2(n)
1000000 loops, best of 3: 716 ns per loop

> %timeit sum_digits3(n)
1000000 loops, best of 3: 479 ns per loop

> %timeit sum(map(int, str(n)))
1000000 loops, best of 3: 1.42 us per loop

> %timeit sum([int(digit) for digit in str(n)])
100000 loops, best of 3: 1.52 us per loop

> %timeit sum(int(digit) for digit in str(n))
100000 loops, best of 3: 2.04 us per loop

Si desea seguir sumando los dígitos hasta obtener un número de un solo dígito (una de mis características favoritas de los números divisibles por 9) puedes hacer:

def digital_root(n):
    x = sum(int(digit) for digit in str(n))
    if x < 10:
        return x
    else:
        return digital_root(x)

Lo que en realidad resulta ser bastante rápido en sí mismo...

%timeit digital_root(12312658419614961365)

10000 loops, best of 3: 22.6 µs per loop

esto podría ayudar

def digit_sum(n):
    num_str = str(n)
    sum = 0
    for i in range(0, len(num_str)):
        sum += int(num_str[i])
    return sum

Si entiendes que te ha resultado provechoso este artículo, sería de mucha ayuda si lo compartes con otros juniors y nos ayudes a difundir nuestra información.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *