Python 如何从范围生成器打印出不能被给定列表中的任何数字整除的数字

Python 如何从范围生成器打印出不能被给定列表中的任何数字整除的数字,python,algorithm,Python,Algorithm,我试着打印出某个范围内的素数,并决定使用埃拉托什尼的分段筛来寻找从2到sqrt(n)的素数并使用列表中找到的素数打印出任何范围内的素数,这样范围内的一个数就不能被筛选列表中的任何一个数整除,最终成为一个素数 我的代码适用于小范围,如2到10和3到5,但对于大n,开始打印副本和非素数。有人帮忙修理这个吗 from math import sqrt, ceil #Creating segmented sieve start=2 stop=1000000000 siev

我试着打印出某个范围内的素数,并决定使用埃拉托什尼的分段筛来寻找从2到sqrt(n)的素数并使用列表中找到的素数打印出任何范围内的素数,这样范围内的一个数就不能被筛选列表中的任何一个数整除,最终成为一个素数

我的代码适用于小范围,如2到10和3到5,但对于大n,开始打印副本和非素数。有人帮忙修理这个吗

from math import sqrt, ceil    

#Creating segmented sieve  

start=2    
stop=1000000000    
sieve=[i for i in range(2,ceil(sqrt(stop)+1))]    
for num in range(0,len(sieve)):    
        num2=num+1    
        while num2<len(sieve):    
            if sieve[num2]%sieve[num]==0:    
                sieve.pop(num2)    
                num2+=1    
            else:    
                num2+=1

#printing primes from start to stop using primes in sieve to ignore their multiples
    
for n in range(start,stop+1):    
    if n==sieve[0]:    
        print(n)    
        continue    
    if n%sieve[0]==0:    
        continue
    else:    
        p=1    
        while p<len(sieve):    
            if n==sieve[p]:    
                print(n)    
                p+=1    
                continue   
            if n%sieve[p]==0:
                p+=1
                continue
            else:
                p+=1
                print(n)
来自数学导入sqrt,ceil
#创建分段筛
开始=2
停止=100000000
筛子=[i代表范围内的i(2,ceil(sqrt(停止)+1))]
对于范围(0,len(sieve))中的num:
num2=num+1

当num2时,问题在while循环中。如果满足循环中的一个条件,这意味着您找到了一个素数,因此您应该“中断”循环,而不是打印它并继续。此外,为了确保筛选列表中的所有数字都能检查该数字,还需要一个最终的条件集,以便只有在其他条件不满足且到达筛选列表末尾时,该条件集才会中断

     while p < len(sieve):
        if n == sieve[p]:
            print(n)
            break
        if n % sieve[p] == 0:
            break
        if p == (len(sieve)-1):
            print(n)
            break
        else:
            p += 1

问题在while循环中。如果满足循环中的一个条件,这意味着您找到了一个素数,因此您应该“中断”循环,而不是打印它并继续。此外,为了确保筛选列表中的所有数字都能检查该数字,还需要一个最终的条件集,以便只有在其他条件不满足且到达筛选列表末尾时,该条件集才会中断

     while p < len(sieve):
        if n == sieve[p]:
            print(n)
            break
        if n % sieve[p] == 0:
            break
        if p == (len(sieve)-1):
            print(n)
            break
        else:
            p += 1

while
循环中,为什么要
继续
更改打印值?我不确定我是否理解您的问题,但我将
继续
放置为递增p,并检查该条件是否适用于下一次迭代。在
while
循环中,你为什么要
继续
修改打印值?我不确定我是否理解你的问题,但我将
继续
设置为递增p,并检查条件是否适用于下一次迭代。如果你打破循环,递增
p
有什么意义?如果你需要,递增
p
有什么意义你要打破这个循环吗?