python - 我求1000以下所有3或5的倍数之和的方法

标签 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 。我这里的逻辑怎么出错了?

最佳答案

您循环遍历了错误的范围并将 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/

相关文章:

python - 需要正则表达式或者 BeautifulSoup 可以优化输出

python - 将 Xvfb 和 CutyCapt 作为 Python 子进程运行

python - Pandas 数据框使每个唯一的 ID 号 NAT

python - 使用 SHAP 的 Tkinter 回调中的异常

python - mysql pandas 在列上查询时出现 unicode 错误

python - 从两侧实现 __rmul__,python

python - 如何通过 id discord.py 获取消息

python - 如何在 ListView 中提供之前修改 Django 查询集

python - 仅将选定的列转换为使用熔化和枢轴转置?

Python Beautifulsoup CSS 选择器不起作用