Python - 数字求和

3 投票
3 回答
7375 浏览
提问于 2025-04-16 02:43

我正在尝试计算一个范围内所有数字的总和,也就是把这个范围内的所有数字加起来。

我使用的是Python语言:

limit = 10
sums = []
for x in range(1,limit+1):
    for y in range(1,limit+1):
        sums.append(x+y)

这个方法运行得很好,不过因为用了嵌套循环,如果范围设置得太大,计算这些总和会花费很多时间。

有没有什么办法可以不使用嵌套循环来实现这个呢?

(这只是我需要做的一个简化版本,目的是为了解决一个ProjectEuler的问题。这个问题涉及到计算所有丰裕数的总和。)

3 个回答

0

我不太确定有没有好的方法可以不使用嵌套循环。

如果我是你,我会这样写:

[x+y for x in range(1,limit+1) for y in range(1,limit+1)]

1

我想把一个范围内的所有数字加起来,也就是把这个范围内的所有数字都加在一起。

所以你想计算 limit**2 的和。

因为有嵌套循环,如果范围太大,计算这些和会花费很多时间。

错了:这不是因为“嵌套循环”造成的,而是因为你在计算一个平方数量的和,所以你做的工作量也是平方级别的。

有没有办法不使用嵌套循环来实现这个?

你可以像@aaron的回答那样掩盖嵌套的部分,并且由于问题的对称性,你可以减少一半的和的计算(虽然这和你的代码做的事情不一样),但是,要准备一个包含平方数量项的列表,绝对无法避免做平方级别的工作。

不过,针对你提到的目的

获取所有丰盈数的和。

你需要做一个无限的工作,因为丰盈数是无限的;-)。

我觉得你想的是问题23,但其实这个问题很不同:它要求的是所有不能表示为两个丰盈数之和的数字的和。你问的这个求和和解决那个问题之间的关系我真的搞不懂。

2
[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]

撰写回答