【问题标题】:While loop vs a for loop in finding sum of multiples of 3 and 5 under 1000While 循环与 for 循环在 1000 下查找 3 和 5 的倍数之和
【发布时间】:2018-06-06 12:58:16
【问题描述】:

不太熟悉while循环,但我认为它是一种替代方法,所以这可能是一个基本错误。

我需要查找 1000 以下的自然数之和,即 3 和 5 的倍数。例如 10 以下

multiples of 3 and 5 < 10 = 3,5,6,9
sum = 23

我使用 for 循环的代码如下(这是我最初的解决方案):

def multiple():
    lst = []
    for x in range(334): #didn't know how else to use a for loop but to find the largest value of x using a calculator
        if 3*x < limit:
            lst.append(3*x)
        if 5*x< 1000:
            lst.append(5*x)
        if (3*x > 1000) and (5*x > 1000): #unnecessary in a forloop with a range but this is just to maintain symmetry with while loop
            break 
    lst2 = list(set(lst)) #remove duplicates 
    print(sum(lst2))

multiple()

我的代码使用了一个while循环(这个解决方案甚至没有出现在控制台中——>也许这就是错误所在):

def multiple():
    lst = []
    while True:
        x = 1
        if 3*x < 1000:
            lst.append(3*x)
        if 5*x< 1000:
            lst.append(5*x)
        if (3*x > 1000) and (5*x > 1000):
            break
        x += 1
    lst2 = list(set(lst)) #remove duplicates 
    print(sum(lst2))

multiple()

期望的输出:

233168

除了如何纠正 while 循环之外,我的 for 循环或 while 循环的任何改进也将受到欢迎。谢谢

【问题讨论】:

  • 所以它是3的倍数 5?
  • 3 和 5 的倍数如果不清楚@KlausD。
  • 尝试在循环之后打印x 的值,然后从那里开始工作。 (另外,我认为循环到 1000 并选择 x % 3x % 5 为零的值会更好。)
  • 那么最小的数字是 15。
  • 我认为存在误解,我展示的示例是针对 10 岁以下的。但我正在寻找 1000 以下的 3 的倍数和 5 的倍数的总和,而不是公倍数。抱歉,我认为这就是误解所在

标签: python python-3.x loops for-loop while-loop


【解决方案1】:

一种相当直接的方法是遍历从 1 到 1000 的每个数字,并检查它是否能被 3 或 5 整除,然后将它们全部相加。

total = sum(x for x in range(1, 1001) if x%3 == 0 or x%5 == 0)
total
# returns:
234168

【讨论】:

  • 要从 1 迭代到 1000 我们如何在不使用范围的情况下做到这一点,因为范围包括 0,只是询问
  • 如果将 2 个参数传递给 range 函数,它将创建一个 range 对象,其中 start 和 stop 作为两个参数。换句话说,range(1,10) 从 1 迭代到 9; range(7, 30) 从 7 迭代到 29 等。
  • 谢谢!一直以为2个争论是结束和步骤,应该正确阅读文档。
【解决方案2】:
#!/usr/bin/env python
def multiple():
    lst = []
    x=1
    while (3*x < 1000) or (5*x < 1000):
        if 3*x < 1000:
            lst.append(3*x)
        if 5*x < 1000:
            lst.append(5*x)
        x += 1
    lst2 = list(set(lst)) #remove duplicates
    print(sum(lst2))

multiple()

【讨论】:

    【解决方案3】:

    关键调试

    既然你是新人,让我们借此机会在我们解决它之前分析错误。首先请注意,您根本没有注意到任何打印输出。因此,您的 print() 语句要么没有运行,要么只打印空格。我们可以排除后者,因为 sum() 将返回一个整数。

    因此,print() 永远不会运行。该函数已正确定义和调用,因此这不是问题。现在通知while True:;这是一个预警信号。如果 while 循环永远不会结束,print() 将永远不会运行。我们确实注意到有多个 break 语句应该停止循环,但它们可能存在问题。

    现在我们检查循环如何更新。首先,注意i+=1。这似乎是对的。但是,i=1 也在 while 循环中。这不可能是正确的,因为每次迭代 i 都会被重置。这将导致循环永远运行。

    这种对代码的批判性分析只是通过实践构建的,但希望这个答案能够让您深入了解如何自己解决这个问题(以及我是如何查看您的代码的)。

    另请注意,将打印语句添加到 while 循环中进行测试会让您注意到 i 始终为 1。

    工作代码

    def multiple():
        lst = []
        x = 1 # moved from line below
        while True:
            # x = 1 should not go here
            if 3*x < 1000:
                lst.append(3*x)
            if 5*x< 1000:
                lst.append(5*x)
            if (3*x > 1000) and (5*x > 1000):
                break
            x += 1
        lst2 = list(set(lst)) #remove duplicates 
        print(sum(lst2))
    
    multiple()
    

    【讨论】:

    • 这是有道理的!谢谢,下次调试的时候我会尽量这样推理。也将尝试此代码,看看它是否有效,谢谢!
    【解决方案4】:

    另一种解决方案:

    使用 for 循环:

    def multiple():
        sum = 0
        for _ in xrange(1, 1001):
            if _ % 3 == 0 or _ % 5 == 0:
                sum += _
    
        return sum
    
    print(multiple()) 
    

    使用 while 循环:

    def multiple():
        sum = 0
        cnt = 1
        while cnt <= 1000:
            if cnt % 3 == 0 or cnt % 5 == 0:
                sum += cnt
            cnt += 1
        return sum
    
    print(multiple()) 
    

    输出:

    234168
    

    【讨论】:

    • 感谢您的选择!这比我的效率高得多!
    • @KOOTSHOOTS 很高兴知道:)
    猜你喜欢
    • 2017-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多