Отладка программы простого числа Python

Я написал код для генератора простых чисел Python, чтобы сгенерировать первые 100 простых чисел. Но, так или иначе, я получаю не простые числа, как 22, 25 и т. Д. В моем выводе. Я проверял это снова и снова в течение нескольких часов и до сих пор не могу понять, где я ошибся ... Пожалуйста, помогите!

Вот мой код:

from math import sqrt

y=[2]
x=3

while len(y)!=100:
   for i in range (2,int(round(sqrt(x)+1))):
     if x%i==0:
        x=x+1

     else:
        y.append(x)
        x=x+1
        break

print(y)
 Just Ice25 июл. 2016 г., 14:26
Оформить заказ на этой странице, возможно, будет полезно:Простой генератор простых чисел python

Ответы на вопрос(5)

ваше другое не должно быть внутри цикла. Вы будете когда-либо только смотреть на элемент дляi = 2

Как это сделать :

from math import sqrt, ceil
prime_list = [2]
x = 2
while prime_list != 100:
    x += 1
    is_prime = True
    for element in range(2,int(ceil(sqrt(x)))):
        # if x is divided, then we go to next iteration
        if x%element == 0:
            is_prime = False
            break
    if is_prime:
        y.append(x)

делится ли число наi переходя от 2 доsqrt(x) это правильно, но как только вы нажмете число, которое не является фактором, вы предполагаете, что число простое, что не правильно. Вы должны проверить все числа, и если ни один из них не является фактором, то вы можете сделать вывод, что ваш номер прост:

from math import sqrt

y=[2]
x=3

while len(y)!=100:
    isPrime=True
    for i in range (2,int(round(sqrt(x)+1))):
        if x%i==0:
            x=x+1
            isPrime=False
            break             # See Mr Nun's answer
    if(isPrime):
        y.append(x)
        x=x+1

print(y)

Как было указано, это не очень эффективное решение. Проверьте ссылку в ответе @ user2346536.

Я бы сделал это так; немного больше Pythonic:

y = [2]
x = 3
while len(y) < 100:
    if all(x % i != 0 for i in range(2, int(round(sqrt(x) + 1)))):
        y.append(x)
    x = x + 1

print(y)

all() Функция очень полезна.

Это больше похоже на то, что вы сделали; пожалуйста, обратите внимание наbreak заявление и что оно делает:

from math import sqrt

y=[2]
x=3

while len(y) != 100:
    is_prime = True
    for i in range (2, int(round(sqrt(x) + 1))):
        if x % i == 0:
            x += 1
            is_prime = False
            break # this means that x is not prime and we can move on, note that break breaks only the for loop
    if is_prime:
        y.append(x)
        x += 1

print(y)
 Chris_Rands25 июл. 2016 г., 15:28
+1, потому что это самый питонический способ, но учтите, что во втором случаеelse пункт может быть использован наfor цикл, как я показываю в моем ответе

но ни один из них не показывает, что вы действительно можете использоватьelse пункт оfor петля. Подробнее об этомВот, Так что вам не нужноif is_prime: заявление. Полученный код может выглядеть примерно так.

 from math import sqrt

 y = [2]
 x = 3

 while len(y) != 100:
    for i in range (2, int(round(sqrt(x) + 1))):
        if x % i == 0:
            x = x + 1
            break

    else:
        y.append(x)
        x = x + 1
print(y)

Совет:x+=1 может заменитьx=x+1

Более того, как @ user2346536, вы можете использовать гораздо более эффективный алгоритм для вычисления простых чисел, что будет важно, если вы просматриваете большие числа.

 user234653625 июл. 2016 г., 14:40
Плюс, потому что я понятия не имел о том, чтобы использовать цикл for! Хотя это определенно смущает меня

x к вашему массиву, как только он не может быть разделен на «хотя бы один из i» вместо «не может быть разделен на каждый из i»

Также этот алгоритм очень неэффективен. Для быстрой попытки:https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes

from math import sqrt

y=[2]
x=3

while len(y)!=100:
    prime = True
    for i in [ i for i in y if i < sqrt(x) + 1 ]:
        if x%i==0:
            prime = False
            break

    if prime:
        y.append(x)

    x=x+1


print(y)

Обратите внимание, что я уже оптимизировал ваш алгоритм путем деления только на ранее найденные простые числа.

Ваш ответ на вопрос