【问题标题】:What's restricting this while loop from working properly?是什么限制了这个 while 循环正常工作?
【发布时间】:2020-10-10 07:13:47
【问题描述】:

我真的很惭愧无法弄清楚这一点,但这让我很生气!我不明白为什么我的 while 循环条件不起作用。根据初始 for 循环中的范围,在 range 中的第二个数字超过 105000 后,我得到了可变数量的术语(超过 10001)。

prime = []

terms = 10001
length = 0

while length <= terms:

    for i in range(2, 110000): 
        isPrime = True

        for j in range(2, int(i**0.5) + 1): 
            if i%j == 0: 
                isPrime = False
                break

        if isPrime:
           prime.append(i)
    
    length = len(prime)

print(length)

输出结果是

10024

我最初尝试使用 len(prime),然后创建了可变长度,正如预期的那样,它没有任何区别。

请朝正确的方向轻推我以修复此错误。 ????

【问题讨论】:

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


    【解决方案1】:

    您没有在外部for 循环内针对terms 测试length 值,因此它将始终返回所有素数直到范围的末尾。您需要将该检查添加到该循环中。例如:

    prime = []    
    terms = 10001
    
    for i in range(2, 110000): 
        isPrime = True
    
        for j in range(2, int(i**0.5) + 1): 
            if i%j == 0: 
                isPrime = False
                break
    
        if isPrime:
           prime.append(i)
        
        if len(prime) == terms:
            break
    
    print(len(prime))
    

    输出:

    10001
    

    请注意,您可以通过利用 for 循环中的 else 子句来简化代码(删除 isPrime 标志):

    for i in range(2, 110000): 
        for j in range(2, int(i**0.5) + 1): 
            if i%j == 0: 
                break
        else:
           prime.append(i)
        
        if len(prime) == terms:
            break
    

    【讨论】:

    • 感谢您向我指出这一点。我现在对 python 的细微差别又熟悉了一步。
    • @SachinKrishna 不用担心 - 我很高兴这很有用。
    • 我想知道这个 else 子句在顶部没有与之对齐的 if 子句时是如何工作的。这不是 else 语句的必要条件吗? @尼克
    • @SachinKrishna 不,在 python 中,for 循环可以有一个 else 子句;如果 for 循环中没有 break,则执行它。请参阅manual 它有一个与您的代码一样的示例
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-17
    • 2016-07-14
    • 2012-05-02
    • 1970-01-01
    相关资源
    最近更新 更多