숫자의 자릿수 합계를 찾으려면, 즉 :
- 입력:
932
- 출력 :
14
,(9 + 3 + 2)
이를 수행하는 가장 빠른 방법은 무엇입니까?
나는 본능적으로했다.
sum(int(digit) for digit in str(number))
온라인에서 찾았습니다.
sum(map(int, str(number)))
속도를 위해 사용하는 것이 가장 좋으며 더 빠른 다른 방법이 있습니까?
숫자의 자릿수 합계를 찾으려면, 즉 :
932
14
,(9 + 3 + 2)
이를 수행하는 가장 빠른 방법은 무엇입니까?
나는 본능적으로했다.
sum(int(digit) for digit in str(number))
온라인에서 찾았습니다.
sum(map(int, str(number)))
속도를 위해 사용하는 것이 가장 좋으며 더 빠른 다른 방법이 있습니까?
x % 9
,이 기사를보십시오 : sjsu.edu/faculty/watkins/Digitsum0.htm
답변:
게시 한 두 줄 모두 괜찮지 만 순수하게 정수로 할 수 있으며 가장 효율적입니다.
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
//
대신을 사용해야 합니다 /
. 그렇지 않으면 오답을 얻습니다.
n
% timeit 호출 의 가치는 무엇입니까 ?
한 자리 숫자 (내가 좋아하는 숫자의 특성 중 하나는 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
digital_root(n) = n-9*(n-1//9)
이것은 도움이 될 수 있습니다
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)]))
가장 좋은 방법은 수학을 사용하는 것입니다.
나는 이것을 학교에서 알았습니다. (일종 코드 전쟁에서도)
def digital_sum(num):
return (num % 9) or num and 9
이것이 코드에서 어떻게 작동하는지는 모르겠지만 수학이라는 것을 알고 있습니다.
숫자가 9로 나눌 수 있으면 digital_sum은 9가되고
그렇지 않으면 num % 9
디지털 합계가됩니다.
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])
따라서 결과에 추가됩니다.
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()
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
재귀 솔루션을 사용했습니다.
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))
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))
map
조금 더 빠릅니다.