web-dev-qa-db-ja.com

数字の合計-python

数字の桁の合計を見つけたい場合、つまり:

  • 入力:932
  • 出力:14、つまり(9 + 3 + 2)

これを行う最も速い方法は何ですか?

私は本能的にやった:

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

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

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

速度のために使用するのが最善であり、さらに高速な他の方法はありますか?

61
SpFW

純粋に整数で行うことができ、最も効率的です:

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
95
Pavel Anossov

1桁の数字(割り切れる数字の私のお気に入りの特徴の1つを取得するまで数字の合計を続けたい場合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
13
d8aninja

これは役立つかもしれません

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
4
Aftab Lateef

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

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

これも使用できます:

def sum_digits(num):
    num = str(num)
    digitSum = 0
    for i in num:
        digitSum += int(i)
    return digitSum
print sum_digits(875)
1
Sam Mendes
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()
0
itachi
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
StJoesy

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

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

0
Ash
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])

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

0
Arghyadeep Giri

また、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
simran sinha

これを試して

print(sum(list(map(int,input()))))
0
praveen nani