我的方法是找到低于1000的3或5的所有倍数的总和

时间:2014-10-15 18:50:10

标签: python

我希望使用以下代码找到低于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。我在这里的逻辑怎么出错?

2 个答案:

答案 0 :(得分:1)

您正在循环错误的范围并添加两次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的条件使用括号{{{ 1}}语句(冒号负责分隔它):

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

最后,作为一个参考点,可以将整个事物作为一个单行。在这里,我已经通过实际进行乘法来建立多个列表,只是循环遍历1000以下的所有数字并通过3或5测试它们的可分性:

   a = multiples_of(3)
   b = multiples_of(5)
   print sum(set(a+b))

答案 1 :(得分:0)

由于您使用的是5的倍数,不应该for j in range(330):for j in range(200):吗?