92

数字の桁の合計を求めたい場合、すなわち:

  • 入力:932
  • 出力:14、これは(9 + 3 + 2)

これを行うための最速の方法は何ですか?

私は本能的にしました:

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

そして私はこれをオンラインで見つけました:

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

速度を上げるために使用するのに最適な方法はどれですか。さらに高速な方法は他にありますか。

4

20 に答える 20

127

投稿した行はどちらも問題ありませんが、純粋に整数で行うことができ、最も効率的です。

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
于 2013-02-18T15:45:41.913 に答える
16

1桁の数字(9で割り切れる数字の私のお気に入りの特徴の1つ)が得られるまで数字を合計し続けたい場合は、次のことができます。

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
于 2016-09-27T21:13:35.470 に答える
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
于 2016-09-06T09:31:17.773 に答える
5

問題解決の課題のWebサイトの1つでこれを見つけました。私のものではありませんが、機能します。

num = 0            # replace 0 with whatever number you want to sum up
print(sum([int(k) for k in str(num)]))
于 2019-01-22T20:19:09.667 に答える
4

Codecademyの課題をいくつか実行して、次のように解決しました。

def digit_sum(n):
    digits = []
    nstr = str(n)
    for x in nstr:
        digits.append(int(x))
    return sum(digits)
于 2017-04-29T16:20:17.050 に答える
4

最良の方法は数学を使うことです。
私はこれを学校から知っていました(ちょっとcodewarsからも)

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

これがコードでどのように機能するかはわかりませんが、数学であることは知っています

数値が9で割り切れる場合、digital_sumは9になります。
そうでない場合はnum % 9、デジタル和になります。

于 2020-09-11T11:34:56.100 に答える
2

これを試して

    print(sum(list(map(int,input("Enter your number ")))))
于 2019-07-22T13:42:03.607 に答える
1

これはループや再帰のない解決策ですが、負でない整数に対してのみ機能します(Python3):

def sum_digits(n):
    if n > 0:
        s = (n-1) // 9    
        return n-9*s
    return 0
于 2020-05-23T12:33:38.610 に答える
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ループ内で、number(n)は文字列に変換され、ループindex(i)で分割され、各桁が取得されます。---> str(n)[ i:i + 1 ]

このスライスされた数字は整数に変換されます----> int(str(n)[i:i + 1])

したがって、結果に追加されます。

于 2017-12-22T21:05:08.863 に答える
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()
于 2018-09-21T17:49:13.353 に答える
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) 

あなたは任意の数の桁を取ることができます

于 2018-11-22T08:37:26.760 に答える
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

于 2019-07-08T11:44:55.943 に答える
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))
于 2019-12-24T17:23:35.983 に答える
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倍遅く、約2倍遅いです

sum(int(x) for x in str(n))
于 2020-10-25T09:33:53.630 に答える
0

これは私が自分で行う方法であり、BigIntライブラリなしで任意精度の整数を適切に処理できます。

function sumdigits(x,k,z){

    gsub(/[^1-9]+/,"",x)    # throw away junk, and all 0's
    z += gsub(++k, "",x)    # get rid of all the 1's

    while ( x!="" ) {  

       # process 2 numbers at a time, so 
       # even in worst case, the while() loop
       # is only called 4 cycles, while offering 
       # rapid early-exit.
 
       z +=  (++k * gsub(k,"",x))+\
             (++k * gsub(k,"",x)) ;
    }
    return z 
}

それを楽しむために、私はランダムに3つの合成的に大きな整数を生成しました。それぞれ、46,539,36110進数で、数字の合計はそれぞれ2億をはるかに超えています。

214,942,897 217,165,213 223,275,043

私の2018システムでは、平均して約1.75秒程度でした。

小さい入力の場合:

最大長整数の合計が0.807秒最大の長23,019,933-digit整数の合計が102,221,680 0.109秒 2,829,207-digit 13,258,766

于 2021-10-24T10:56:06.687 に答える
0
def digits_sum(a):
    sum = 0
    for i in range(len(str(a))):
        sum += a // 10 ** i % 10
    return sum
于 2021-11-14T12:48:09.277 に答える
-1
num = 123
dig = 0
sum = 0
while(num > 0):
  dig = int(num%10)
  sum = sum+dig
  num = num/10

print(sum)//この行の上にスペースを追加してください

于 2018-02-27T18:35:22.357 に答える
-1

あなたはこれを試すことができます

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

    return sum
于 2018-08-13T16:09:02.160 に答える
-3

3桁の数字でのみ機能しますが、機能します

a = int(input())
print(a // 100 + a // 10 % 10 + a % 10)
于 2020-09-23T07:04:52.527 に答える
-5
n = str(input("Enter the number\n"))

list1 = []

for each_number in n:

        list1.append(int(each_number))

print(sum(list1))
于 2017-06-09T13:59:37.203 に答える