嘿所以我试图做一个挑战,将每个数字加到3或5的倍数1000以下,当我输入这段代码时:
for x in xrange(1000):
if x % 3 == 0 or x % 5 == 0:
place = list([x])
sum(place)
它只列出了3和5的倍数的所有数字,有没有什么方法可以添加它列出的所有数字?
答案 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))
使用发生器可确保即使范围在数十亿之内,也可确保内存使用率低。