Как распечатать числа из генератора диапазонов, которые не делятся ни на какие числа в данном списке - PullRequest
0 голосов
/ 20 июня 2020

Я пытаюсь распечатать простые числа в определенном диапазоне и решил go с помощью сегментированного сита Эратосфена найти простые числа от 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)

1 Ответ

2 голосов
/ 20 июня 2020

Проблема была в то время l oop. Если одно из условий в l oop выполняется, это означает, что вы нашли простое число, поэтому вам следует «вырваться» из l oop вместо того, чтобы печатать его и продолжать. И, чтобы гарантировать, что число проверяется всеми числами в списке сита, окончательный условный набор, так что он прерывается только в том случае, если другие условия не выполняются, и он достиг конца списка сита.

     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

Вывод:

2
3
5
7
11
13
17
19
23
29
31
37
41
43
47
53
59
61
67
71
73
79
83
89
97
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...