为了账号安全,请及时绑定邮箱和手机立即绑定

求和数字的数字 - python

求和数字的数字 - python

守着星空守着你 2019-08-17 16:23:38
求和数字的数字 - python如果我想找到数字的数字之和,即:输入: 932输出:14,即(9 + 3 + 2)这样做的最快方法是什么?我本能地做了:sum(int(digit) for digit in str(number))我在网上找到了这个:sum(map(int, str(number)))哪种方法最适合速度,还有其他方法更快吗?
查看完整描述

3 回答

?
杨__羊羊

TA贡献1943条经验 获得超7个赞


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


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


查看完整回答
反对 回复 2019-08-17
?
千巷猫影

TA贡献1829条经验 获得超7个赞

如果你想保持数字的总和,直到你得到一位数字(我最喜欢的数字特征之一被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


查看完整回答
反对 回复 2019-08-17
?
呼啦一阵风

TA贡献1802条经验 获得超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


查看完整回答
反对 回复 2019-08-17
  • 3 回答
  • 0 关注
  • 801 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信