求和数字的数字 - python

SpF*_*pFW 62 python sum digits

如果我想找到数字的数字之和,即:

  • 输入: 932
  • 输出:14,即(9 + 3 + 2)

这样做的最快方法是什么?

我本能地做了:

sum(int(digit) for digit in str(number))
Run Code Online (Sandbox Code Playgroud)

我在网上找到了这个:

sum(map(int, str(number)))
Run Code Online (Sandbox Code Playgroud)

哪种方法最适合速度,还有其他方法更快吗?

Pav*_*sov 97

你可以纯粹用整数做它,它将是最有效的:

def sum_digits(n):
    s = 0
    while n:
        s += n % 10
        n //= 10
    return s
Run Code Online (Sandbox Code Playgroud)

或者divmod:

def sum_digits2(n):
    s = 0
    while n:
        n, remainder = divmod(n, 10)
        s += remainder
    return s
Run Code Online (Sandbox Code Playgroud)

但你发布的这两行都很好.

 

没有增强任务的版本更快:

def sum_digits3(n):
   r = 0
   while n:
       r, n = r + n % 10, n // 10
   return r
Run Code Online (Sandbox Code Playgroud)

 

> %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
Run Code Online (Sandbox Code Playgroud)

  • sum_digits3()应该使用`//`而不是`/`,对吗?否则我会得到错误的答案. (3认同)
  • 是的,有些东西在需要布尔值的地方等价于 False。请参阅此处:https://docs.python.org/2/library/stdtypes.html#truth-value-testing (3认同)
  • 您的%timeit调用中`n`的值是什么? (2认同)

d8a*_*nja 14

如果你想保持数字的总和,直到你得到一位数字(我最喜欢的数字特征之一被9整除),你可以这样做:

def digital_root(n):
    x = sum(int(digit) for digit in str(n))
    if x < 10:
        return x
    else:
        return digital_root(x)
Run Code Online (Sandbox Code Playgroud)

事实证明这本身就很快......

%timeit digital_root(12312658419614961365)

10000 loops, best of 3: 22.6 µs per loop
Run Code Online (Sandbox Code Playgroud)

  • 对于(以 10 为基数的数字)的数字根,存在一个直接公式:“digital_root(n) = n-9*(n-1//9)” (2认同)
  • 为了对数字求和直到得到一位数,可以直接使用模 9 算术:“(n - 1) % 9 + 1” (2认同)

小智 6

这可能有帮助

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
Run Code Online (Sandbox Code Playgroud)


小智 5

在其中一个解决问题的挑战网站上找到了这个。不是我的,但它有效。

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