如何在Python中对一个数字的位数进行求和? (超详细教程)

388 阅读5分钟

问题的提出

给出一个整数。如何对这个数字的所有数字进行求和,以计算交叉脚(交叉总数)?

请考虑以下例子。

  • 12 –> 1+2 = 3
  • 123 –> 1+2+3 = 3
  • 244 –> 2+4+4 = 10
  • 981223 –> 9+8+1+2+2+3 = 25

方法1:使用生成器表达式的sum()

Python内置的 [sum(`iterable`)](https://blog.finxter.com/python-sum/ "Python sum() – A Simple Illustrated Guide")函数对iterable 中的所有元素进行求和。这可以是一个列表,一个元组,一个集合,或者任何其他允许你在元素上迭代的数据结构

要对一个给定的整数的所有数字求和,请将生成器表达式 int(digit) for digit in str(number) 传递给内置的 [sum()](https://blog.finxter.com/python-sum/ "Python sum() – A Simple Illustrated Guide")函数中。生成器表达式使用内置的 [str(number)](https://blog.finxter.com/python-str-function/ "Python str() Function")函数将数字转换为字符串,遍历每个数字字符,并将每个字符转换为整数。sum() 函数对所有这些字符进行求和。

number = 123
res = sum(int(digit) for digit in str(number))

print(res)
# 6

你可以在这个视频中了解更多关于sum() 函数的信息。

方法2:map()函数

接下来给出另一种方法。

要使用map() 函数对一个给定的整数的所有数字进行求和,请遵循以下步骤。

  • 将数字转换成字符串,使用 [str(number)](https://blog.finxter.com/python-str-function/ "Python str() Function")
  • 将结果传入 [map(func, iterable)](https://blog.finxter.com/python-map/ "Python map() — Finally Mastering the Python Map Function [+Video]")函数作为第二个参数iterable 。将内置的 int 函数作为第一个参数func 。这将每个字符数字转换为一个整数。
  • 将产生的整数数字的迭代 传入 [sum()](https://blog.finxter.com/python-sum/ "Python sum() – A Simple Illustrated Guide")函数来计算所有数字的总和。
number = 123
res = sum(map(int, str(number)))

print(res)
# 6

请随意观看以下视频,深入了解map() 函数。

方法3:快速整数解决方案

前面两个解决方案将整数转换为字符串,并将数字转换为整数。这是相对昂贵的--而且不是严格需要的。一个纯粹的 "基于整数 "的解决方案可以实现更好的性能。

number = 123
res = 0
while number:
    res += number % 10
    number //= 10
print(res)

该代码执行以下步骤来计算所有数字的总和。

  • 从结果0开始。
  • 重复进行。
  • ... 使用就地加法,number % 10模数 结果的多位数的最后位置的整数值加到当前的所有数字之和上。例如,123 % 10 的结果是3 ,即只计算最后一位的数值。
  • ...... 用整数除法将多位数的最后一个位置除以10例如,123 // 10 的结果是12 ,即删除了最后一位数字。
  • 一旦数字的值为0,就结束循环。

这是迄今为止最快的解决方案,因为它不需要从整数到字符串的转换。

如果你需要一些背景资料,请看以下关于原地加法的视频。

方法4:只用整数的封闭公式

对于大多数问题,如果可能的话,最好的解决方案是封闭式公式。你输入数字,它就会根据几个算术运算快速计算出结果。如果有一个封闭式公式来解决本文所研究的所有数字之和问题,那不是很酷吗?

嗯,这个公式是存在的!🙂

要计算数字n的所有位数之和,只需将n插入以下公式n-9*(n-1) // 9.可以用Legendre在每个位数的值上展开一个和公式来证明,这个封闭公式可以计算所有位数之和。

下面是各自的代码,只需插入公式并确保输入的整数不是0。

def sum_digits(n):
    return n-9*(n-1) // 9 if n > 0 else 0

print(sum_digits(123))
# 6
print(sum_digits(10000000))
# 1

然而,该公式只对自然数(非负数)有效。如果你对此没有意见,这个公式在性能上将是无可匹敌的。

要了解返回语句中使用的三元运算符,请看下面的视频。

何去何从?

理论够了,让我们来实践一下吧!

要想在编码方面取得成功,你需要走出去,为真正的人解决真正的问题。这样你才能轻松成为六位数的收入者。而这也是你如何在实践中打磨出你真正需要的技能。毕竟,学习没有人需要的理论有什么用?

实践项目就是你在编码中磨练你的锯子的方法!

你想通过专注于实际的代码项目,成为一个代码大师,真正为你挣钱,为人们解决问题吗?

那就成为Python的自由开发者吧!这是接近提高Python技能任务的最佳方式--即使你是一个完全的初学者。

参加我的免费网络研讨会"如何建立你的高收入技能Python",看看我是如何在网上发展我的编码业务的,你也可以这样做--从你自己家里的舒适度。

现在就参加免费网络研讨会

The postHow to Sum the Digits of a Number in Python?first appeared onFinxter.