如何在范围内添加数字

时间:2017-08-18 21:11:20

标签: python list project add

嘿所以我试图做一个挑战,将每个数字加到3或5的倍数1000以下,当我输入这段代码时:

for x in xrange(1000):
if x % 3 == 0 or x % 5 == 0:
    place = list([x])
    sum(place)

它只列出了3和5的倍数的所有数字,有没有什么方法可以添加它列出的所有数字?

6 个答案:

答案 0 :(得分:1)

不是测试0到1000之间的每个数字,看它是3还是5的倍数,然后对它们求和,生成set只包含0到1000之间的3或5的倍数。

nums = set(range(3, 1000, 3))
nums.update(range(5, 1000, 5))
total = sum(nums)

首先不生成你不想要的数字会更有效率。

(需要set,因为有些数字是3和5的倍数,并且该集合将自动仅包含这些数字一次。另请注意,我们的范围完全省略0,因为它不会影响总和。微不足道的效率。)

答案 1 :(得分:1)

您的问题是您在循环的每次迭代中都没有保留任何值。您的循环将通过以下方式修复:

place = []
for x in range(1000):
    if x % 3 == 0 or x % 5 == 0:
        place.append(x)
sum(place)

或者只是沿途计算:

result = 0
for x in range(1000):
    if x % 3 == 0 or x % 5 == 0:
        result += x
result

正如所指出的,一个简单的生成器表达式可以解决这个问题:

sum(x for x in range(1000) if x % 3 == 0 or x % 5 == 0)

注意:我使用Py3 - 在Py2中xrange()将通过避免list的{​​{1}}构造进行优化。

range()有一个封闭的表格:

sum(range(n+1))

e.g:

s(n) = n * (n + 1) // 2

可以扩展为sum([0, 1, 2, 3, ..., 999]) == 999 * 1000 // 2 == 499500

sum(range(0, n+1, c))

e.g:

s(n, c) = c * (n//c) * (n//c + 1) // 2

因此,您可以将问题重写为sum([0, 3, 6, 9, ..., 999]) == 3 * (999//3) * (999//3 + 1) // 2 == 166833 ,您必须减去s(999, 3) + s(999, 5) - s(999, 15)或重复计算s(999, 15)3可以整除的所有值,例如:

5

对于提出的所有In []: n = 1000 s = lambda n, c: c * (n//c) * (n//c + 1) // 2 s(n-1, 3) + s(n-1, 5) - s(n-1, 15) Out[]: 233168 方法,这是O(1) vs O(n)

答案 2 :(得分:0)

试试这个:

{
  "name": "portfolio",
  "version": "1.0.0",
  "description": "Displaying self skills",
  "main": "index.html",
  "scripts": {
    "start": "npm run lite",
    "test": "echo \"Error: no test specified\" && exit 1",
    "lite": "lite-server"
  },
  "author": "Vikranth Kanumuru",
  "license": "ISC",
  "devDependencies": {
  },
  "dependencies": {
    "lite-server": "^2.3.0",
    "bootstrap": "^4.0.0-alpha.6",
    "font-awesome": "^4.7.0"
  }
}

答案 3 :(得分:0)

这也是列表理解的一个很好的例子:

total = sum([x for x in xrange(1000) if x % 3 == 0 or x % 5 == 0])

编辑:在这种情况下,它甚至不需要成为一个列表(我会想象更有效率,因为[纠正我,如果我错了]对发生器求和只遍历范围一次,而第一个遍历原始范围,创建一个范围,然后再遍历它以得到总和):

total = sum(x for x in xrange(1000) if x % 3 == 0 or x % 5 == 0)

答案 4 :(得分:0)

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

创建范围内的数字列表,踩踏可分数,然后删除重复项,对结果求和。

答案 5 :(得分:0)

一个班轮:

top

sum((x for x in range(1000) if any((x % 3 == 0, x % 5 == 0))

使用发生器可确保即使范围在数十亿之内,也可确保内存使用率低。