Нахождение n-го простого числа с использованием Python

Когда я запускаю этот код, даже для простого подсчета до 10-го простого числа (вместо 1000) я получаю перекос / измученный вывод - все «не простые» заголовки для моей переменной is_composite, мой test_num дает мне простые и составные числа, и мой prime_count выключен

Некоторые ответы, которые разработчики разделили, используют функции и математический импорт - это то, что мы еще не рассмотрели. Я не пытаюсь получить наиболее эффективный ответ; Я просто пытаюсь написать работающий код на Python, чтобы понять основы циклов.

  # test a prime by diving number by previous sequence of number(s) (% == 0).  Do this by
  # counting up from 1 all the way to 1000.

test_num = 2 #these are the numbers that are being tested for primality
is_composite = 'not prime' # will be counted by prime_count
prime_count = 0 #count the number of primes


while (prime_count<10): #counts number primes and make sures that loop stops after the 1000th prime (here: I am just running it to the tenth for quick testing)


 test_num = test_num + 1   # starts with two, tested for primality and counted if so
 x = test_num - 1  #denominator for prime equation

 while (x>2):   
  if test_num%(x) == 0:
   is_composite = 'not prime'
  else: 
   prime_count = prime_count + 1 
  x = x - 1 


  print is_composite
  print test_num
  print prime_count 
 goutham202702 февр. 2014 г., 06:57
 zkidd08 окт. 2010 г., 03:49
DGM - это домашнее задание - но для OpenCourse Ware - без оценки. Просто пытаюсь учиться.
 Wok07 окт. 2010 г., 23:32
Это домашнее задание. Все мы знаем, что это как раз первая проблема первого набора проблем первого назначенияВведение в информатику и программирование из MIT.
 Russell Borogove07 окт. 2010 г., 23:34
Я не вижу никаких печатных операторов или других выходных данных, поэтому ничего не возвращается или (явно) не происходит.
 Adriano Varoli Piazza07 окт. 2010 г., 23:23
Не по теме: некоторые комментарии в вашем коде верны, другие очевидны:while x > 2: # runs while x is greater than 2 самоочевидно. В общем: прокомментируйте почему, а не что.
 zkidd07 окт. 2010 г., 23:18
Ничто не возвращается / происходит
 Adriano Varoli Piazza08 окт. 2010 г., 00:53
Я был тем, кто повторил вопрос, используя «большой».
 ajnatural07 окт. 2010 г., 23:35
Это звучит очень похоже на projecteuler
 SingleNegationElimination08 окт. 2010 г., 00:28
У нас с тобой разные идеи«Большой» простые числа. На мой взгляд, большое простое число достаточно велико, чтобы все простые числа, меньшие, чем это простое число кандидата, заняли бы больше памяти (места на жестком диске?), Чем доступно на машине (кластере?), Тестирующей простое число кандидата на простоту. Для меня первые примерно 2 ^ 40 простых чиселмаленький
 zkidd07 окт. 2010 г., 23:31
Спасибо Адриано - я буду иметь это в виду с тех пор re: comments
 eldarerathis07 окт. 2010 г., 23:17
Какиеконкретно не работает?
 alternative07 окт. 2010 г., 23:19
Ваш алгоритм медленный, уточните его, используя теорию чисел. В частности, проверять только простые числа, меньшие или равные квадратному корню из текущего числа.
 Adriano Varoli Piazza08 окт. 2010 г., 14:37
@zkidd: проблема не в причине домашней работы, а в вашем подходе: если бы вы пришли с этим вопросом и сказали: «Я сделал то и это, и у меня есть эта проблема здесь», это показало бы, что вы действительно поставлен в тупик после принятия усилий. То, что я сказал «У меня проблемы» с каким-то кодом, который поначалу даже не содержал оператора печати, показывает отсутствие усилий.

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

Решение Вопроса

Смотрите советы, данныеMIT для вашего назначения. Я цитирую их ниже:

Инициализируйте некоторые переменные состояния

Сгенерировать все (странный) целые числа> 1 в качестве кандидатов на простое число

Для каждого целого числа-кандидата проверьте, является ли оно простым

3.1. Один простой способ сделать это - проверить, делит ли любое другое целое число> 1 кандидата с остатком 0. Для этого вы можете использоватьмодульная арифметикаНапример, выражение a% b возвращает остаток после деления целого числа a на целое число b.

3.2. Вы можете подумать о том, какие целые числа нужно проверять как делители - конечно, вам не нужно выходить за рамки проверяемого кандидата, нокак скоро вы можете перестать проверять?

Если кандидат является основным, распечатайте некоторую информацию, чтобы вы знали, где вы находитесь в вычислении, и обновите переменные состояния

Остановитесь, когда достигнете подходящего конечного состояния. При формулировке этого условияне забудь что ваша программа не сгенерировалапервое простое число (2).

Это может выглядеть так:

def primes(n):
    # http://stackoverflow.com/questions/2068372/fastest-way-to-list-all-primes-below-n-in-python/3035188#3035188
    """ Returns  a list of primes < n """
    sieve = [True] * n
    for i in xrange(3,int(n**0.5)+1,2):
        if sieve[i]:
            sieve[i*i::2*i]=[False]*((n-i*i-1)/(2*i)+1)
    return [2] + [i for i in xrange(3,n,2) if sieve[i]]
 zkidd07 окт. 2010 г., 23:45
вчера я прошел через эти подсказки, но все еще возникают проблемы. отсюда мой пост.
 zkidd07 окт. 2010 г., 23:46
Чувствую себя довольно плохо, что я задаю этот вопрос, хотя я прошел через все эти подсказки и пересмотрел лекцию тоже.
 Wok07 окт. 2010 г., 23:49
Вы можете посмотреть наболее эффективные решения чтобы получить Pythonic путь.

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