如果我想找到一个数字的数字之和,即:
- 输入:
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
如果你想继续对数字求和,直到得到一个位数(我最喜欢的数字可以被 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
这可能会有所帮助
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
在解决问题的挑战网站之一上找到了这个。不是我的,但它有效。
num = 0 # replace 0 with whatever number you want to sum up
print(sum([int(k) for k in str(num)]))
Doing some Codecademy challenges I resolved this like:
def digit_sum(n):
digits = []
nstr = str(n)
for x in nstr:
digits.append(int(x))
return sum(digits)
最好的方法是使用数学。
我从学校知道这一点。(有点也来自代码战)
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
您也可以使用名为 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)
你可以取任意位数
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()
我想出了一个递归解决方案:
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))
def digits_sum(a):
sum = 0
for i in range(len(str(a))):
sum += a // 10 ** i % 10
return sum
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])
因此添加到结果中。
我自己就是这样做的,它可以在没有任何 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
十进制数字,每个数字的总和超过 2 亿
214,942,897
217,165,213
223,275,043
在我 2018 年的系统上,它平均约为 1.75 秒左右。
对于较小的输入:
长整数总和为 0.807 秒23,019,933-digit
长整数总和为0.109102,221,680
秒 2,829,207-digit
13,258,766
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
一个以 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))
你可以试试这个
def sumDigits(number):
sum = 0
while(number>0):
lastdigit = number%10
sum += lastdigit
number = number//10
return sum
num = 123
dig = 0
sum = 0
while(num > 0):
dig = int(num%10)
sum = sum+dig
num = num/10
print(sum) // 确保在此行上方添加空格
它只适用于三位数字,但它有效
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))