Підсумуйте цифри числа


78

Якщо я хочу знайти суму цифр числа, тобто:

  • Вхідні дані: 932
  • Вихід:, 14який є(9 + 3 + 2)

Який найшвидший спосіб це зробити?

Я інстинктивно зробив:

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

і я знайшов це в Інтернеті:

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

Що найкраще використовувати для швидкості, і чи існують інші методи, які є ще швидшими?


3
Це прекрасно і рівноцінно. mapце трохи швидше.
Павло Аноссов

Ви можете зробити x % 9, подивіться цю статтю: sjsu.edu/faaching/watkins/Digitsum0.htm
Вашингтон

Відповіді:


113

Обидва рядки, які ви опублікували, чудові, але ви можете зробити це суто в цілих числах, і це буде найбільш ефективно:

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

3
sum_digits3 (), мабуть, слід використовувати //замість /, так? В іншому випадку я отримую неправильні відповіді.
LarsH

Чи можу я тут отримати пояснення щодо "while n:"? Я не знаю, як Python розуміє, коли зупинятись. Наприклад, сума цифр 324 повинна бути 3 + 2 + 4. Для останнього (передня цифра три), у циклі while 3/10 = 0, а потім стає "while 0:". Отже, чи означає 0, якщо 0 означає False до циклу, а потім виходить із циклу і повертає s?
нам

3
Так, деякі речі еквівалентні False в місцях, де очікуються булеві значення. Дивіться тут: docs.python.org/2/library/stdtypes.html#truth-value-testing
Павло Аноссов

1
Чи можна знайти формулу за сумою цифр непарної послідовності цілих чисел?
Ануп Тоффі

5
Яке значення nу ваших% timeit дзвінків?
d8aninja

15

Якщо ви хочете продовжувати підсумовувати цифри, поки не отримаєте одноцифрове число (одна з моїх улюблених характеристик чисел, що діляться на 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

1
Розумно, складаючи функцію в собі!
vashts85

рекурсія! @ vashts85
d8aninja

Я теж, що це таке, що ділиться на 9?
Роналду Нашіменто,

@RonaldoNascimento Я не знаю, але це мене зачаровує. І 3 с.
d8aninja

1
Для цифрового кореня (з числа 10 бази) існує пряма формула:digital_root(n) = n-9*(n-1//9)
reschu

7

Це може допомогти

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

1
дякую, цей мені допоміг у вирішенні проблеми: вивчіть, чи може дане число дати модуль 0 після підсумовування його цифр.
Янніс Дран,

4

Виконуючи деякі завдання Codecademy, я вирішив це так:

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

2

Знайшов це на одному з веб-сайтів із вирішення проблем. Не моє, але воно працює.

num = 0            # replace 0 with whatever number you want to sum up
print(sum([int(k) for k in str(num)]))

1

Ось рішення без жодного циклу або рекурсії, але працює лише для невід’ємних цілих чисел (Python3):

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

1

Найкращий спосіб - використовувати математику.
Я знав це ще зі школи. (Звичайно, також з кодерев)

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

Просто не знаю, як це працює в коді, але я знаю, що це математика

Якщо число ділиться на 9, тоді digital_sum буде 9,
якщо це не так, тоді num % 9буде цифрова сума.


Пояснення див. У посиланні в цьому коментарі .
snakecharmerb

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

"результат" ініціалізується 0.

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

Ця нарізана цифра перетворюється назад у ціле число ----> int (str (n) [i: i + 1])

І отже, додав до результату.


2
Будь ласка, додайте кілька слів, щоб пояснити ваш код і спосіб, яким він відповідає на питання.
Янніс

0
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()

5
Привіт! Ласкаво просимо на сайт! Хоча ваша відповідь є вірним рішенням проблеми, вона не відповідає на саме запитання: "Що швидше?" Враховуючи, що це питання швидкості, чи можете ви показати результати тестування вашого рішення проти наведених прикладів?
Kind Stranger

0

Ви також можете спробувати це за допомогою вбудованої_ін_функції під назвою divmod ();

number = int(input('enter any integer: = '))
sum = 0
while number!=0: 
    take = divmod(number, 10) 
    dig = take[1] 
    sum += dig 
    number = take[0] 
print(sum) 

Ви можете взяти будь-яку цифру


0
reduce(op.add,map(int,list(str(number))))

Тест:

from datetime import datetime
number=49263985629356279356927356923569976549123548126856926293658923658923658923658972365297865987236523786598236592386592386589236592365293865923876592385623987659238756239875692387659238756239875692856239856238563286598237592875498259826592356923659283756982375692835692385653418923564912354687123548712354827354827354823548723548235482735482354827354823548235482354823548235482735482735482735482354823548235489235648293548235492185348235481235482354823548235482354823548235482354823548234



startTime = datetime.now()

for _ in  range(0,100000) :
    out=reduce(op.add,map(int,list(str(number))))

now=datetime.now()
runningTime=(now - startTime)

print ("Running time:%s" % runningTime)
print(out)

Тривалість: 0: 00: 13.122560 2462



0

Я придумав рекурсивне рішення:

def sumDigits(num):
#   print "evaluating:", num
  if num < 10:
    return num

  # solution 1
#   res = num/10
#   rem = num%10
#   print "res:", res, "rem:", rem
#   return sumDigits(res+rem)

    # solution 2
  arr = [int(i) for i in str(num)]
  return sumDigits(sum(arr))

# print(sumDigits(1))
# print(sumDigits(49))
print(sumDigits(439230))
# print(sumDigits(439237))

0

Базове число 10 може бути виражене як серія форми

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

отже, сума цифр числа - це сума коефіцієнтів доданків.

На основі цієї інформації суму цифр можна обчислити так:

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

Це фактично є зворотом безперервного ділення на 10 у прийнятій відповіді. З огляду на додаткові обчислення в цій функції порівняно з прийнятою відповіддю, не дивно, що цей підхід працює погано в порівнянні: він приблизно в 3,5 рази повільніший і приблизно вдвічі повільніший, ніж

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

-1
num = 123
dig = 0
sum = 0
while(num > 0):
  dig = int(num%10)
  sum = sum+dig
  num = num/10

print (sum) // не забудьте додати пробіл над цим рядком


numне менше 0. Нічого не станеться. Зробіть, що більший ніж, і це може спрацювати.
сорак

так.. помилкою це було менше ніж. зараз це більше і працює нормально
Джаянт Панді

-1

Ви можете спробувати це

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

    return sum

-2

Він працює лише для трицифрових чисел, але працює

a = int(input())
print(a // 100 + a // 10 % 10 + a % 10)

-5
n = str(input("Enter the number\n"))

list1 = []

for each_number in n:

        list1.append(int(each_number))

print(sum(list1))

1
Будь ласка, використовуйте посилання редагування, щоб пояснити, як працює цей код, а не просто дайте код, оскільки пояснення, швидше за все, допоможе майбутнім читачам. Див. Також Як відповісти . джерело
Джед Фокс

Це не відповідає на питання.
Усі працівники є основними
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.