1

我只是想将 3 和 5 的所有倍数相加到 1000,同时确保我不会将重合倍数相加两次,因此是或。如果它不是 3 的倍数,我只希望它添加 5 的倍数。我知道我可以删除重叠的倍数,但我想知道如何使用 if 语句仅添加 5 的倍数(如果确实如此)除以 3 时不给出余数 0。提前致谢

a=range(0, 1000,3 ) or range(0,1000,5)
b=sum(a)
print (b)
4

4 回答 4

4

您可以组合这两个列表并从联合中获取唯一值:

sum(set(range(0, 1000, 3) + range(0, 1000, 5)))

set是唯一元素的无序列表。所以,这里有两个列表,一个是 3 的倍数,另一个是 5 的倍数;然后将此新列表转换为set仅保留唯一元素。

于 2013-10-02T02:33:33.440 回答
3

您可以使用列表推导:

a = [x for x in range(1000) if ((x % 3 == 0) or (x % 5 == 0))]
b = sum(a)
于 2013-10-02T02:33:24.047 回答
2

您可以删除所有 15 的倍数。

与其他解决方案相比,这是一个非常暴力的解决方案,但它也非常简单。求所有 3 的倍数和 5 的所有倍数的总和。但是,您会将 15 的倍数相加两次,因此请从最终总和中删除它们:

total = sum(range(0, 1000,3)+range(0,1000,5))-sum(range(0,1000,15))
于 2013-10-02T02:34:07.280 回答
1

这是一种总共 5 次加法、3 次乘法、3 次除法和微不足道的额外内存的方法;-)

def sumrange(start, stop, step):
    x = xrange(start, stop, step)
    if x:
        return (x[0] + x[-1]) * len(x) // 2
    else:
        return 0

print sumrange(0, 1000, 3) + sumrange(0, 1000, 5) - sumrange(0, 1000, 15)

这依赖于等差数列的总和等于数列中元素的数量乘以平均值(第一个和最后一个元素的总和的一半)。所有这些都可以在不使用对象构造(甚至生成)列表的情况下完成xrange(在 Python 2 中 -range在 Python 3 中使用)。

于 2013-10-02T02:47:58.747 回答