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
。
答案 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
只会跳到最小闭环的下一次迭代,所以你不会先进入更高级别的循环。