2013-07-16 4 views
0

This Project Euler question меня немного смущает.Project Euler # 27 с использованием Python

Вот мое решение, которое я думал, было правильным:

import math 
start = time.time() 
def check_prime(a, b, n): 
    num = n**2 + a * n + b 
    mod = 3 
    if num >= 0: 
     check = int(math.sqrt(num)) 
    else: 
     return False 
    while mod <= check: 
     if num % mod == 0: 
      return False 
     mod += 2 
    return True 
def main(): 
    n = 0 
    max_n = 0 
    for a in xrange(-1000, 1000): 
     for b in xrange(-1000, 1000): 
      while check_prime(a, b, n): 
       n += 1 
       if n > max_n: 
        max_n = n 
        product = a * b 
     n = 0 
    print max_n, product 
    print time.time() - start 
if __name__ == '__main__': 
    main() 

Это дает мне подряд премьер-список 376, где фактический список является только 71. Я думаю, что я просто трудно понять вопрос. Разве самый длинный премьер-лист не должен составлять не менее 80, поскольку это тот, который приведен в качестве примера? Моя программа вычисляет произведение двух терминов для 71 списка, но затем оно продолжает расти до 376.

Есть ли что-то в этом вопросе?

+0

Просто взглянув на это быстро, я вижу ошибки, связанные с ошибкой в ​​границах цикла 'for'. – user2357112

+3

Вы перезагружаете 'n' во внешнем цикле. Я уверен, что вы хотите сделать это во внутреннем цикле или реорганизовать свой код, чтобы вам не нужны переменные счетчика, подверженные ошибкам. – user2357112

+0

Ух, да. Я думал, что это <= 1000, но это всего лишь 1000. Тем не менее тот же результат. Спасибо хоть. – Josh

ответ

2

Не самый длинный премьер-лист должен быть не менее 80, поскольку это тот, который приведен в качестве примера?

Формула, приведенная в постановке задачи является n² 79n + 1601, так a = 79 и b = 1601 > 1000. Поэтому вам не следует ожидать, что число последовательных простых чисел будет больше 80. Фактически, 71 - правильное количество последовательных простых чисел. Теперь вам нужно только убедиться, что ваш product верен.

Подсказка:

значение a * b отрицательно.

+0

Да, я не обращал достаточно пристального внимания и не замечал, что 1601 явно> 1000. Спасибо, хотя. – Josh