Сумма цифр числа-python



Если я хочу найти сумму цифр числа, то есть:




  • вход: 932

  • вывод: 14, то есть (9 + 3 + 2)


Какой самый быстрый способ сделать это?

Я инстинктивно сделал:



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


И я нашел это в интернете:



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


Что лучше всего использовать для скорости, и есть ли другие методы, которые еще быстрее?

1372   11  

11 ответов:

Вы можете сделать это чисто целыми числами, и это будет наиболее эффективно:

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

Или с divmod:

def sum_digits2(n):
    s = 0
    while n:
        n, remainder = divmod(n, 10)
        s += remainder
    return s
Но обе строки, которые вы опубликовали, в порядке.

Еще быстрее работает версия без дополнительных назначений:

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

Если вы хотите продолжать суммировать цифры, пока не получите одноразрядное число (Одна из моих любимых характеристик чисел, делящихся на 9) вы можете сделать:

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

Который на самом деле оказывается довольно быстрым сам по себе...

%timeit digital_root(12312658419614961365)

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

Это может помочь

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

Выполняя некоторые задачи кодек-химии, я решил это следующим образом:

def digit_sum(n):
arr = []
nstr = str(n)
for x in nstr:
    arr.append(int(x))
return sum(arr)

Вы также можете использовать это:

def sum_digits(num):
    num = str(num)
    digitSum = 0
    for i in num:
        digitSum += int(i)
    return digitSum
print sum_digits(875)
def digitsum(n):
    result = 0
    for i in range(len(str(n))):
        result = result + int(str(n)[i:i+1])
    return(result)

"result" инициализируется 0.

Внутри цикла for число (n) преобразуется в строку, которую нужно разделить с индексом цикла(i) и получить каждую цифру. --- > str (n) [i: i+1]

Эта нарезанная цифра преобразуется обратно в целое число ----> int (str (n) [i:i+1])

И, следовательно, добавляется к результату.

def sumOfDigits():

    n=int(input("enter digit:")) 
    sum=0
    while n!=0 :

        m=n%10
        n=n/10
        sum=int(sum+m)

    print(sum)

sumOfDigits()

Лучший способ-использовать понимание списка:

sum([int(digit) for digit in str(abs(number))])
num = 123
dig = 0
sum = 0
while(num > 0):
  dig = int(num%10)
  sum = sum+dig
  num = num/10

Print (sum) / / обязательно добавьте пробел над этой строкой

Вы можете попробовать это

def sumDigits(number):
    sum = 0
    while(number>0):
        lastdigit = number%10
        sum += lastdigit
        number = number//10

    return sum
n = str(input("Enter the number\n"))

list1 = []

for each_number in n:

        list1.append(int(each_number))

print(sum(list1))

Comments

    Ничего не найдено.