2016-06-06 2 views
1

Я вижу, что существует множество различных способов генерации простых чисел. Мой код очень длинный и избыточный, но я знаю, что он может определенно быть сжатым и сделать менее повторяющимся с небольшими изменениями, и я надеялся, что я могу быть направлен в правильном направлении. По сути, я хотел бы автоматизировать процесс, который отображается в моем коде, чтобы он мог работать для любого диапазона и всех простых чисел.Написание алгоритма для генерации простых чисел в Python в заданном диапазоне

Вот мой код:

def primes(): 
    multiplesList1 = [] 
    multiplesList2 = [] 
    multiplesList3 = [] 
    multiplesList4 = [] 
    multiplesList5 = [] 
    multiplesList6 = [] 
    multiplesList7 = [] 
    multiplesList8 = [] 
    multiplesList9 = [] 
    for i in range(2,1000): 
     if i % 2 != 0 or i == 2: 
      multiplesList1.append(i) 
    for j in multiplesList1: 
     if j % 3 != 0 or j == 3: 
      multiplesList2.append(j) 
    for x in multiplesList2: 
     if x % 5 != 0 or x == 5: 
      multiplesList3.append(x) 
    for y in multiplesList3: 
     if y % 11 != 0 or y == 11: 
      multiplesList4.append(y) 
    for z in multiplesList4: 
     if z % 13 != 0 or z == 13: 
      multiplesList5.append(z) 
    for a in multiplesList5: 
     if a % 17 != 0 or a == 17: 
      multiplesList6.append(a) 
    for b in multiplesList6: 
     if b % 19 != 0 or b == 19: 
      multiplesList7.append(b) 
    for c in multiplesList7: 
     if c % 23 != 0 or c == 23: 
      multiplesList8.append(c) 
    for d in multiplesList8: 
     if d % 29 != 0 or d == 29: 
      multiplesList9.append(d) 
    return multiplesList9 

print(primes()) 
+1

Предлагаю googling «Сито эратосфена». –

+0

Посмотрите здесь: https://rosettacode.org/wiki/Sieve_of_Eratosthenes#Python –

ответ

0

Все, что вам нужно сделать, это создать второй цикл с расстояния вплоть до предыдущего числа и проверять каждый модуль. Если 0 - результат, то он не должен быть простым.

if __name__ == "__main__": 
    prime = True 
    for i in range(2, 1000): 
     for x in range(2, i): 
      if i % x == 0: 
       prime = False 
     if prime: 
      print(i) 
     prime = True 
+0

Использование сита с простыми числами, вероятно, будет быстрее, если скорость беспокоит – Stefan

+0

@duncan Спасибо за этот пост, он исправил проблему. Я был на пороге этого, но ты помог мне туда добраться! – Chris95

+0

@duncan Мне просто интересно, какова цель первой строки в вашем коде? (если __name__ == "__main__":) – Chris95