如果我想找到数字的数字之和,即:
932
14
,即(9 + 3 + 2)
这样做的最快方法是什么?
我本能地做了:
sum(int(digit) for digit in str(number))
我在网上找到了这个:
sum(map(int, str(number)))
哪种方法最适合速度,还有其他更快的方法吗?
答案 0 :(得分:92)
你可以纯粹用整数做它,它会是最有效的:
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 :(得分:10)
如果您希望对数字进行求和,直到您获得 个位数字 (我最喜欢的数字之一可被9整除),您可以这样做:< / p>
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
答案 2 :(得分:4)
这可能会有所帮助
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
答案 3 :(得分:1)
做一些Codecademy挑战我解决了这个问题:
def digit_sum(n):
arr = []
nstr = str(n)
for x in nstr:
arr.append(int(x))
return sum(arr)
答案 4 :(得分:1)
您也可以使用:
def sum_digits(num):
num = str(num)
digitSum = 0
for i in num:
digitSum += int(i)
return digitSum
print sum_digits(875)
答案 5 :(得分:1)
最好的方法是使用数学。
我从学校就知道这一点。
def digital_sum(num):
return (num % 9) or num and 9
只是不知道它在代码中是如何工作的,但我知道这是数学
如果一个数字可被9整除,则其digital_sum将为9,
如果不是这种情况,那么num % 9
将是数字总和。
答案 6 :(得分:1)
这是没有任何循环或递归的解决方案,但仅适用于非负整数(Python3):
def sum_digits(n):
if n > 0:
s = (n-1) // 9
return n-9*s
return 0
答案 7 :(得分: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)
您可以输入任意数字
答案 8 :(得分: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))
答案 9 :(得分: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))
答案 10 :(得分:0)
尝试一下
print(sum(list(map(int,input()))))
答案 11 :(得分: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
答案 12 :(得分:0)
在其中一个解决问题的挑战网站上找到了这一点。不是我的,但是可以。
num = 0 #replace 0 with whatever number you want to sum up
print(sum([int(k) for k in str(num)]))
答案 13 :(得分: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()
答案 14 :(得分:0)
def digitsum(n):
result = 0
for i in range(len(str(n))):
result = result + int(str(n)[i:i+1])
return(result)
&#34;导致&#34;初始化为0。
在for循环中,数字(n)被转换为一个字符串,用循环索引(i)分割并得到每个数字。 ---&GT;的 STR 强>(N)[<强> I:i + 1的强>
这个切片数字被转换回整数----&gt;的 INT 强>(STR(N)[I:+ 1])
因此加入了结果。
答案 15 :(得分:-1)
您可以尝试
def sumDigits(number):
sum = 0
while(number>0):
lastdigit = number%10
sum += lastdigit
number = number//10
return sum
答案 16 :(得分:-1)
num = 123
dig = 0
sum = 0
while(num > 0):
dig = int(num%10)
sum = sum+dig
num = num/10
print(sum)//确保在此行上方添加空格
答案 17 :(得分:-2)
仅适用于三位数,但有效
a = int(input())
print(a // 100 + a // 10 % 10 + a % 10)
答案 18 :(得分:-2)
这是我找到的最佳解决方案:
function digitsum(n) {
n = n.toString();
let result = 0;
for (let i = 0; i < n.length; i++) {
result += parseInt(n[i]);
}
return result;
}
console.log(digitsum(192));
答案 19 :(得分:-3)
n = str(input("Enter the number\n"))
list1 = []
for each_number in n:
list1.append(int(each_number))
print(sum(list1))