Python—打印前1000个素数不需要';停不下来

Python—打印前1000个素数不需要';停不下来,python,for-loop,primes,Python,For Loop,Primes,在我的最新代码中有一个问题,我根本不知道如何解决。基本上,我打印出的是前1000个素数,但我的代码打印出的素数远远超过了前1000个素数的限制。我已在代码中指定在1000处停止。这是我的密码: import itertools counter = 1 while (counter <= 1000): for i in itertools.count(start=3, step=1): for a in range(2, i/2): if

在我的最新代码中有一个问题,我根本不知道如何解决。基本上,我打印出的是前1000个素数,但我的代码打印出的素数远远超过了前1000个素数的限制。我已在代码中指定在1000处停止。这是我的密码:

import itertools

counter = 1

while (counter <= 1000):
    for i in itertools.count(start=3, step=1):
        for a in range(2, i/2):
            if (i % a == 0):
                break
        else:
            print i
            counter += 1

Count
从不停止生成数字,因此本质上你被困在
for
循环中

快速解决方法是:

import itertools

counter = 1

for i in itertools.count(start=3, step=1):
    for a in range(2, i/2):
        if (i % a == 0):
            break
    else:
        print i
        counter += 1
        if counter > 1000:
             break

Count
从不停止生成数字,因此本质上你被困在
for
循环中

快速解决方法是:

import itertools

counter = 1

for i in itertools.count(start=3, step=1):
    for a in range(2, i/2):
        if (i % a == 0):
            break
    else:
        print i
        counter += 1
        if counter > 1000:
             break

您的版本被卡在内部循环中

import itertools

 counter = 1

 for i in itertools.count(start=3, step=1):
    if(counter<1000):
        for a in range(2, i/2):
            if (i % a == 0):
                break
        else:
            print i
            counter += 1
    else:
       break
导入itertools
计数器=1
对于itertools.count中的i(开始=3,步骤=1):

如果(计数器您的版本卡在内部循环中

import itertools

 counter = 1

 for i in itertools.count(start=3, step=1):
    if(counter<1000):
        for a in range(2, i/2):
            if (i % a == 0):
                break
        else:
            print i
            counter += 1
    else:
       break
导入itertools
计数器=1
对于itertools.count中的i(开始=3,步骤=1):

如果(counter你有很多关于为什么你的答案不起作用的回答。我会这样做!我宁愿构建一个素数生成器并从中提取

class PrimeNumberGen(object):
    def __init__(self,max_prime=None):
        if max_prime:
            self.numbers = range(2, max_prime+1)
        else:
            self.numbers = itertools.count(start=2, step=1)
    def __next__(self):
        for num in self.numbers:
            for divisor in range(2, int(num**0.5)+1):
                if num % divisor == 0:
                    break
            else:
                return num

primes = PrimeNumberGen()
for _ in range(1000):
    print(next(prime))

关于为什么你的答案不起作用,你已经得到了很多回答。我想这样做!我宁愿构建一个素数生成器,然后从中提取

class PrimeNumberGen(object):
    def __init__(self,max_prime=None):
        if max_prime:
            self.numbers = range(2, max_prime+1)
        else:
            self.numbers = itertools.count(start=2, step=1)
    def __next__(self):
        for num in self.numbers:
            for divisor in range(2, int(num**0.5)+1):
                if num % divisor == 0:
                    break
            else:
                return num

primes = PrimeNumberGen()
for _ in range(1000):
    print(next(prime))

您需要在所有循环之外初始化计数器一次,按照写入方式,您将在循环内部重置计数器,而每次:

counter = 0
nums = itertools.count(start=3, step=1)

while counter <= 1000:
   i = next(nums)
   for a in range(2, i/2):
        if i % a == 0:
            break
   else:
       print(i)
       counter += 1
计数器=0
nums=itertools.count(开始=3,步骤=1)

当计数器在所有循环之外时,您需要初始化计数器一次,按照您写入计数器的方式,您每次都在计数器内部重置计数器:

counter = 0
nums = itertools.count(start=3, step=1)

while counter <= 1000:
   i = next(nums)
   for a in range(2, i/2):
        if i % a == 0:
            break
   else:
       print(i)
       counter += 1
计数器=0
nums=itertools.count(开始=3,步骤=1)

计数器即使使用您的解决方案,您的代码也会打印999个素数,而不是1000个。(最后一个数字应该是7919,而不是7907)

代码中唯一的问题是


counter=0#而不是counter=1

即使使用您的解决方案,您的代码也会打印999个素数而不是1000个。(最后一个数字应该是7919而不是7907)

代码中唯一的问题是


counter=0#而不是counter=1

您的break语句只对范围内(2,i/2)
循环中断
,而不是它上面的循环。因此,对于i in itertools.count(start=3,step=1)
循环继续进行。@BradBeattie这是设计的,这是正确的。问题是他们需要第二次
中断
,以摆脱更大的循环。
对于范围内的(2,math.sqrt(i)+1)
将更有效率,因为如果
i
有一个素因子,则有一个因子小于或等于
sqrt(i)
。谢谢unutbu-你的break语句只会对范围内(2,i/2)的
循环进行中断,而不是对其上方的循环进行中断。因此,对于i in itertools.count(start=3,step=1)的
循环继续进行。@BradBeattie这是设计的,这是正确的。问题是他们需要第二次
中断
,以摆脱更大的循环。
对于范围内的(2,math.sqrt(i)+1)
将更有效率,因为如果
i
有一个素因子,则有一个因子小于或等于
sqrt(i)
。谢谢unutbu-我会的