如何继续外侧的for循环?

时间:2015-07-22 16:21:34

标签: python primes

def countPrimes(self, n):
        if n <= 1:
            return 0
        if n == 2:
            return 1
        count = 0
        counted = [2, ]
        for num in xrange(3, n+1, 2):
            for c in counted:
                if num % c == 0:
                    continue
            count += 1
            counted.append(num)
        return count

我正在为质数计数问题的解决方案编写代码。我使用count作为存储已经检查过的素数的数组,并将它们用于下一个素数的检查。我尝试使用continue来删除内部for循环,然后一旦找到num不是有效的prime,就不会执行count += 1 and counted.append(num)。但是,我在这里遇到了实施问题,因为continue语句会将我带到另一个c而不是另一个num

3 个答案:

答案 0 :(得分:1)

如果我正确理解了您的问题,您想知道如何打破内部c循环,避免使用其他代码,并继续使用其他num。与其他答案一样,您希望将break与一些智能布尔值一起使用。这是循环的样子:

for num in xrange(3, n+1, 2):
    next_num = False
    for c in counted:
        if num % c == 0:
            next_num = True
            break
    if next_num:
        continue
    count += 1
    counted.append(num)

这样,如果你遇到一个可以被c整除的num,你就会突破内部的c循环,避免将num添加到计数列表中。

答案 1 :(得分:1)

随着时间的推移积累计数和素数列表并没有多大意义。介绍某处不匹配的机会。我用了一些更具描述性的变量名来对代码进行了一些按摩。令人惊讶的是,清晰的名称能够真正使算法变得更有意义。 (至少对我而言)

def primesUpTo(n):
    primes = []
    if n > 1:
        primes.append(2)
    for candidate in xrange(3, n+1, 2):
        for prime in primes:
            candidate_is_prime = candidate % prime
            if not candidate_is_prime: # We're done with this inner loop
                break
        if candidate_is_prime:
            primes.append(candidate)
    return primes

print len(primesUpTo(100))

答案 2 :(得分:0)

尝试使用break代替continue。请参阅documentation here。基本上break会将您从最小的封闭循环中带出来,将您吐回到更高级别的循环中以进行下一次迭代。另一方面,continue只会跳到最小闭环的下一次迭代,所以你不会先进入更高级别的循环。