我已经学习Python不到一个月了,目前正在开发Project Euler。
具有讽刺意味的是,我坚持第一个问题。看看下面我的应用程序道路,我希望得到一些输入,我搞砸了。或使用错误的逻辑。
如果我们列出10以下的所有自然数是3或5的倍数,我们得到3,5,6和9.这些倍数的总和是23.
查找低于1000的3或5的所有倍数的总和。
我的逻辑/代码流
sum = multiple_three + multiple_five
multiple_three = []
multiple_five = []
def multiple_three(bignumber):
for number in range(bignumber):
if number % 3 == 0:
multiple_three.append(number)
def multiple_five(bignumber):
for number in range(bignumber):
if number % 5 == 0:
multiple_five.append(number)
bignumber = 1000
multiple_five(bignumber)
multiple_three(bignumber)
print multiple_three
print multiple_five
答案 0 :(得分:1)
这对我有用。让我知道它是否适合你。
def multiples_of_3_or_5():
for number in xrange(1000):
if not number % 3 or not number % 5:
yield number
print sum(multiples_of_3_or_5())
答案 1 :(得分:1)
让我们看看。
我们可以从范围有一个步骤参数的事实开始。因此range(0,10,3)
之类的内容会让您0,3,6,9
。
所以,首先,我们有
sum(range(0,1000,3)) + sum(range(0,1000,5))
但是等等!被15整除的数字可以被5和3整除!我们算两次吧!呃,呃,让我们把它们减去
sum(range(0,1000,3)) + sum(range(0,1000,5)) - sum(range(0,1000,15))
坎。我想我们在这里仍然缺少一些东西。是否有更简单的方法将算术级数加在一起?可以宣誓有......
类似于(a_0 + a_n)* n / 2,其中n是术语的数量,也许......
def sum_of_arithmetic_progression(start,stop,step):
n = (stop-start)//step #floor division :P
end = start + step*n
return (start + end)*n/2.0
sum_of_arithmetic_progression(0,1000,3)+sum_of_arithmetic_progression(0,1000,5)-sum_of_arithmetic_progression(0,1000,15)
答案 2 :(得分:0)
你不打印金额。但除此之外,你计算的数字是15次两次,即3的倍数和5。
是一个快速的解决方案 print(sum(set(multiple_three+multiple_five)))
这里multiple_three + multiple_five给出了一个连接列表。 set标识唯一元素,sum将输出总和。更好的方法是使用"或"运算符,并将数字附加到@Destry Amiott建议的单个循环中。