我想使用下面的代码查找 1000 以下 3 或 5 的倍数:
a=[]
b=[]
def multiples_of_3():
i=1
for i in range(330):
m=i*3
if(m<1000):
a.append(m)
def multiples_of_5():
j=1
for j in range(330):
k=j*5
if(k<1000):
b.append(k)
if __name__ == "__main__":
multiples_of_3()
multiples_of_5()
print sum(a) + sum(b)
结果 - 262355
结果不对。应该是 233168 。我这里的逻辑怎么出错了?
最佳答案
您循环遍历了错误的范围并将 15 的倍数相加两次。
我相信这是对您的程序进行的最小更改,使其正常工作:
a=[]
b=[]
def multiples_of_3():
i=1
for i in range(334): # stops at 1 less than the value passed to `range`
m=i*3
if(m<1000):
a.append(m)
def multiples_of_5():
j=1
for j in range(330): # could change to 201 and still work
k=j*5
if(k<1000):
b.append(k)
if __name__ == "__main__":
multiples_of_3()
multiples_of_5()
print sum(set(a+b))
但是您可能应该重新考虑您的方法。使用全局变量通常是一个坏主意 - 查看调用 multiples_of_3()
,无法知道子例程如何处理这些倍数;变量a
没有在任何地方被引用,但在该行之前和该行之后它有两个不同的值。因此,对于初学者来说,我会将子例程转换为纯函数 - 让它们返回数组而不是修改全局变量。
作为次要的风格点,您也不需要在两个函数中使用不同的变量名称,因为它们都是本地的。您不需要在循环之前为 i
分配任何内容(循环将为您创建变量),并且您不需要在 Python 的 if
中的条件两边加上括号> 语句(冒号负责分隔它):
def multiples_of_3():
a = []
for i in range(334):
m = i * 3
if m < 1000:
a.append(m)
return a
def multiples_of_5():
a = []
for i in range(201):
m = i * 5
if m < 1000:
a.append(m)
return a
if __name__ == "__main__":
a = multiples_of_3()
b = multiples_of_5()
print sum(set(a+b))
您还可以将两个 multiples_of
函数组合成一个通用函数,该函数采用一个参数来告诉它返回以下倍数的内容:
def multiples_of(k):
result = []
for i in range(1000/k+1):
multiple = i * k
if multiple < 1000:
result.append(multiple)
return result
您甚至可以将最大值变成可选参数:
def multiples_of(k, under=1000):
result = []
for i in range(under/k+1):
multiple = i * k
if multiple < under:
result.append(multiple)
return result
无论哪种方式,你的主要部分都是这样的:
a = multiples_of(3)
b = multiples_of(5)
print sum(set(a+b))
最后,作为一个引用点,可以将整个事情作为一句话来完成。在这里,我从通过实际执行乘法来构建倍数列表,改为仅循环 1000 以下的所有数字并测试它们是否能被 3 或 5 整除:
print sum([n for n in range(1000) if n%3==0 or n%5==0])
关于python - 我求1000以下所有3或5的倍数之和的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26389924/