[python] 숫자의 자릿수 합산

숫자의 자릿수 합계를 찾으려면, 즉 :

  • 입력: 932
  • 출력 : 14,(9 + 3 + 2)

이를 수행하는 가장 빠른 방법은 무엇입니까?

나는 본능적으로했다.

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

온라인에서 찾았습니다.

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

속도를 위해 사용하는 것이 가장 좋으며 더 빠른 다른 방법이 있습니까?



답변

게시 한 두 줄 모두 괜찮지 만 순수하게 정수로 할 수 있으며 가장 효율적입니다.

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


답변

몇 가지 Codecademy 과제를 수행하면서 다음과 같이 해결했습니다.

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


답변

문제 해결 웹 사이트 중 하나에서 이것을 발견했습니다. 내 것이 아니라 작동합니다.

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


답변

다음은 루프 나 재귀가없는 솔루션이지만 음이 아닌 정수에서만 작동합니다 (Python3).

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


답변

가장 좋은 방법은 수학을 사용하는 것입니다.
나는 이것을 학교에서 알았습니다. (일종 코드 전쟁에서도)

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

이것이 코드에서 어떻게 작동하는지는 모르겠지만 수학이라는 것을 알고 있습니다.

숫자가 9로 나눌 수 있으면 digital_sum은 9가되고
그렇지 않으면 num % 9디지털 합계가됩니다.