Простое число код ошибки 10001 простое (питон) - PullRequest
0 голосов
/ 27 мая 2019

Я создал программу для поиска простых чисел, но когда я пытаюсь получить 10001-е простое число, это не правильно.Я не могу понять, почему.

Я не особо старался, потому что понятия не имею, что попробовать.

import math
startingPrimes = [2,3, 5, 7, 11, 13, 17, 19]
for times in range (2):
    primeList = []
    numbersToBeTested = 0
    for _ in range (startingPrimes[len(startingPrimes)-1]**2):
        primeList.append(_ + 2)
    print ()
    numbersToBeTested = startingPrimes[len(startingPrimes)-1]**2
    print (numbersToBeTested)
    divisor = 0
    term = 0
    dividend = 0
    position = 0

    while divisor < math.sqrt(len(primeList)):
        term = 0
        divisor = startingPrimes[position]
        dividend = primeList[position]
        while term + 1 < len(primeList):

            term = term + 1
            if primeList[term] % divisor == 0:
                if primeList[term] != divisor:
                    primeList.remove(primeList[term])
        position = position + 1
    startingPrimes = primeList

for termOfList in range (len(primeList)):
    print (primeList[termOfList])
print ("How many primes: " + str(len(primeList)))
print ("10001st prime: " + str(primeList[10000]))

Это дает мне 90373, что неправильно!Пожалуйста, помогите!

1 Ответ

1 голос
/ 27 мая 2019

Существует ряд проблем с вашим кодом:

Он генерирует простые числа, не простые , например 99973 = 257 * 389

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

У него причудливые выражения, которые, кажется, не имеют смысла, например ::10000

   for times in range (2):
       primeList = []

Похоже, что код запускается дважды! Но это меняет результат! Где код комментария!

И вот что:

while divisor < math.sqrt(len(primeList)):

Квадратный корень числа простых чисел, найденных вами до сих пор, является пределом при поиске вашего следующего простого числа?

Проблемные программы обычно перезаписываются или перезаписываются - это пример перезаписанной программы. Вы можете решить эту проблему с помощью дюжины строк Python длиной не более примерно 30 символов в доли секунды. Ваша программа требует вдвое больше строк, иногда вдвое длиннее, и занимает около минуты, чтобы получить короткий ответ.

Мой совет: начните все с простого:

Вам не нужно startingPrimes = [2,3, 5, 7, 11, 13, 17, 19]. Достаточно просто инициализировать primeList = [2], чтобы избежать проверки четных чисел и сосредоточиться на нечетных делителях.

Вам не нужно math.sqrt(), просто проверьте, если if divisor * divisor > number: и все необходимые вам делители находятся в primeList.

Единственная операция модификации, которую вам действительно нужно сделать на primeList, это append().

Где-то должен быть явный тест на завершение, например ::

while len(primeList) < n:  # where n = 10001
...