数字の桁の合計を求めたい場合、すなわち:
- 入力:
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
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
これは役立つかもしれません
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
問題解決の課題のWebサイトの1つでこれを見つけました。私のものではありませんが、機能します。
num = 0 # replace 0 with whatever number you want to sum up
print(sum([int(k) for k in str(num)]))
Codecademyの課題をいくつか実行して、次のように解決しました。
def digit_sum(n):
digits = []
nstr = str(n)
for x in nstr:
digits.append(int(x))
return sum(digits)
最良の方法は数学を使うことです。
私はこれを学校から知っていました(ちょっとcodewarsからも)
def digital_sum(num):
return (num % 9) or num and 9
これがコードでどのように機能するかはわかりませんが、数学であることは知っています
数値が9で割り切れる場合、digital_sumは9になります。
そうでない場合はnum % 9
、デジタル和になります。
これを試して
print(sum(list(map(int,input("Enter your number ")))))
これはループや再帰のない解決策ですが、負でない整数に対してのみ機能します(Python3):
def sum_digits(n):
if n > 0:
s = (n-1) // 9
return n-9*s
return 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])
したがって、結果に追加されます。
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()
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)
あなたは任意の数の桁を取ることができます
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倍遅く、約2倍遅いです
sum(int(x) for x in str(n))
これは私が自分で行う方法であり、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,361
10進数で、数字の合計はそれぞれ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
def digits_sum(a):
sum = 0
for i in range(len(str(a))):
sum += a // 10 ** i % 10
return sum
num = 123
dig = 0
sum = 0
while(num > 0):
dig = int(num%10)
sum = sum+dig
num = num/10
print(sum)//この行の上にスペースを追加してください
あなたはこれを試すことができます
def sumDigits(number):
sum = 0
while(number>0):
lastdigit = number%10
sum += lastdigit
number = number//10
return sum
3桁の数字でのみ機能しますが、機能します
a = int(input())
print(a // 100 + a // 10 % 10 + a % 10)
n = str(input("Enter the number\n"))
list1 = []
for each_number in n:
list1.append(int(each_number))
print(sum(list1))