숫자의 자릿수 합산


78

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

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

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

나는 본능적으로했다.

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

온라인에서 찾았습니다.

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

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


3
이것들은 훌륭하고 동등합니다. map조금 더 빠릅니다.
Pavel Anossov 2013

당신은 할 수 있습니다 x % 9,이 기사를보십시오 : sjsu.edu/faculty/watkins/Digitsum0.htm
Washington Guedes

답변:


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 :"에 대한 설명이 필요합니까? 파이썬이 언제 멈출 지 이해하는 방법을 모르겠습니다. 예를 들어 324의 자릿수 합계는 3 + 2 + 4 여야합니다. 마지막 (앞 숫자 3)의 경우 while 루프에서 3 / 10 = 0이고 "while 0 :"이됩니다. 그렇다면 while 0은 루프에 대해 False를 의미하고 루프를 이스케이프하고 s를 반환합니까?
nam

3
네, 일부는 부울 값을 예상하는 곳에서 False와 동일합니다. 여기를 참조하십시오 : docs.python.org/2/library/stdtypes.html#truth-value-testing
파벨 Anossov

1
수식으로 홀수 시퀀스의 자릿수 합계를 찾는 방법이 있습니까?
Anoop Toffy 2014

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 2016

나도 9로 나눌 수있는 것은 무엇입니까?
호나우두 나시 멘토

@RonaldoNascimento 몰라요하지만 저를 매료시킵니다. 그리고 3s.
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을 줄 수 있는지 조사하십시오.
Yannis Dran 2016

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)

"result"는 0으로 초기화됩니다.

for 루프 내에서 number (n)은 루프 인덱스 (i)로 분할 될 문자열로 변환되어 각 숫자를 가져옵니다. ---> str (n) [ i : i + 1 ]

이 슬라이스 된 숫자는 다시 정수로 변환됩니다. ----> int (str (n) [i : i + 1])

따라서 결과에 추가됩니다.


2
코드를 설명하고 질문을 어떻게 해결하는지 몇 단어를 추가하세요.
Yannis

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 ()라고하는 built_in_function으로 이것을 시도 할 수도 있습니다;

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) //이 줄 위에 공백을 추가해야합니다.


num0보다 작지 않습니다. 아무 일도 일어나지 않습니다. 그 이상으로 만들면 작동 할 수 있습니다.
설악

네 .. 실수보다 적었습니다. 지금보다 더 큰 IT 및 작동 미세
얀트 펜디 교수

-1

당신은 이것을 시도 할 수 있습니다

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

    return sum

-2

3 자리 숫자에 대해서만 작동하지만 작동합니다.

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
이 코드가 어떻게 작동하는지 설명 하려면 편집 링크를 사용하고 코드 만 제공하지 마십시오. 설명은 미래의 독자에게 도움이 될 가능성이 더 큽니다. 응답 방법을 참조하십시오 . 소스
제드 폭스

이것은 질문에 대한 답이 아닙니다.
모든 작업자는 필수입니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.