while循环与for循环查找1000和3之间的倍数之和

问题描述 投票:1回答:4

我并不熟悉while循环,但我认为这是另一种选择,所以这可能是一个基本的错误。

我需要寻找1000以下的自然数之和,它是3和5的倍数.E.g低于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循环的任何改进也是受欢迎的。谢谢

python python-3.x loops for-loop while-loop
4个回答
3
投票

批判性调试

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

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

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

这种类型的代码批判性分析只能通过实践来构建,但希望这个答案可以帮助您了解如何自己修复此问题(以及我如何查看代码)。

另请注意,将print语句添加到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()

2
投票

一个相当直接的方法是迭代从1到1000的每个数字并检查它是否可以被3或5整除,然后将它们全部加起来。

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

2
投票

另一种方案:

使用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

1
投票
#!/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()
© www.soinside.com 2019 - 2024. All rights reserved.