Python - 数字求和
我正在尝试计算一个范围内所有数字的总和,也就是把这个范围内的所有数字加起来。
我使用的是Python语言:
limit = 10
sums = []
for x in range(1,limit+1):
for y in range(1,limit+1):
sums.append(x+y)
这个方法运行得很好,不过因为用了嵌套循环,如果范围设置得太大,计算这些总和会花费很多时间。
有没有什么办法可以不使用嵌套循环来实现这个呢?
(这只是我需要做的一个简化版本,目的是为了解决一个ProjectEuler的问题。这个问题涉及到计算所有丰裕数的总和。)
3 个回答
我不太确定有没有好的方法可以不使用嵌套循环。
如果我是你,我会这样写:
[x+y for x in range(1,limit+1) for y in range(1,limit+1)]
我想把一个范围内的所有数字加起来,也就是把这个范围内的所有数字都加在一起。
所以你想计算 limit**2
的和。
因为有嵌套循环,如果范围太大,计算这些和会花费很多时间。
错了:这不是因为“嵌套循环”造成的,而是因为你在计算一个平方数量的和,所以你做的工作量也是平方级别的。
有没有办法不使用嵌套循环来实现这个?
你可以像@aaron的回答那样掩盖嵌套的部分,并且由于问题的对称性,你可以减少一半的和的计算(虽然这和你的代码做的事情不一样),但是,要准备一个包含平方数量项的列表,绝对无法避免做平方级别的工作。
不过,针对你提到的目的
获取所有丰盈数的和。
你需要做一个无限的工作,因为丰盈数是无限的;-)。
我觉得你想的是问题23,但其实这个问题很不同:它要求的是所有不能表示为两个丰盈数之和的数字的和。你问的这个求和和解决那个问题之间的关系我真的搞不懂。
[x + y for x in xrange(limit + 1) for y in xrange(x + 1)]
这样做的计算量还是一样多,但速度大约是for循环的两倍快。
from itertools import combinations
(a + b for a, b in combinations(xrange(n + 1, 2)))
这样可以避免很多重复的求和。我不确定你是否想要记录这些重复的求和。
如果你只是想要每个求和的结果,而不关心是怎么得到的,那么 xrange(2*n + 2)
可以直接给你想要的结果,而且没有重复,也不需要循环。
针对问题的回答:
[x + y for x in set set1 for y in set2]