Сумма всех простых чисел

#python-3.x

#python-3.x

Вопрос:

Я хочу получить сумму всех простых чисел до 2 миллионов. Моя программная логика верна, но это занимает слишком много времени с 2 миллионами. Как я могу сделать это быстрее?

 num_l=[]
y = int(input("enter till what number do you want the sum"))
for count in range(0,y):
           num_l.append(count)

total = 0 

for counter in range(0,y):
           num = num_l[counter]
           if num > 1:  
              for i in range(2,num):  
                  if (num % i) == 0:   
                      break  
              else:
                         total = total   num
                         
print(total)
 

Комментарии:

1. Каков ваш лимит времени?

2. Как и в случае с этим, в настоящее время это занимает больше часа, так что максимум 15-20 минут?

3. Проверка деления на простоту выполняется медленно. Вместо этого используйте сито .

4. вы можете загрузить и использовать список известных простых чисел. зачем их вычислять? это назначение CS?

5. @Kaii Это вопрос проекта Эйлера.

Ответ №1:

просто используйте функцию, чтобы проверить, является ли она простой или нет, и если это так, добавьте ее в счетчик (для total). Приведенный ниже код занимает около 20 секунд, чтобы найти то, что вы хотите. Еще одна вещь заключается в том, что ваш алгоритм проверки того, является ли число простым или нет, имеет длинный диапазон чисел для прохождения, вам не нужно проверять до последнего числа, вам просто нужно пройти диапазон квадратного корня из числа.

 import time


def is_prime(n):
    if n == 1:
        return False
    elif n == 2:
        return True
    else:
        for i in range(2, int(n**0.5) 1):  # this range is just enough
            if n % i == 0:
                return False
        return True


counter = 0
start = time.time()
for i in range(1, 2*10**6): # you can change this range for taking it as input
    if is_prime(i):
        counter  = i
print(counter)
print(time.time() - start)
 

Комментарии:

1. @ Kurosh Я не понял, что ты сделал в этой строке: range(2, int(n**0.5) 1):

2. Я рекомендую прочитать это » geeksforgeeks.org/sieve-of-eratosthenes » за математику, стоящую за этим.

3. Почему списки могут быть проблемой в любое время, не говоря уже о серьезной?

4. @superbrain я допустил ошибку, это совсем не так.

5. @superbrain Это проблема, потому что для достижения 2 миллионов требуется очень много времени, что делает его неэффективным.