Сумма простых чисел ниже 1 миллиона?

Это в основном весь смысл идентификатора. :) Идентификаторы специфичны, их можно использовать только один раз на странице. Классы могут использоваться как довольные.

-2
задан ScrapCode 18 January 2019 в 05:54
поделиться

3 ответа

Сито из Эратосфена является очень простым и довольно быстрым алгоритмом теста на простоту.

Следующая реализация занимает около 400 мс на современной машине, но, вероятно, ее можно было бы оптимизировать и дальше.

limit = 1000000
is_prime = [x % 2 for x in range(limit)]
is_prime[1] = False
is_prime[2] = True
for candidate in range(3, limit, 2):
    if is_prime[candidate]:
        for product in range(candidate * 3, limit, candidate * 2):
            is_prime[product] = False
print(sum(x for x in range(limit) if is_prime[x]))
0
ответ дан Tugrul Ates 18 January 2019 в 05:54
поделиться

Тест на простоту - Википедия

Простейший тест на простоту - пробное деление: учитывая входное число n, проверьте, делит ли любое простое число m от 2 до √n поровну

Я бы начал с определения функции, которая просто проверяет, является ли число простым или нет. Затем используйте эту функцию в цикле, который считает от 3, 5, 7, 9, ..., 999,999 и проверьте, является ли каждое число простым, если оно совпадает, затем добавьте его в переменную суммы.

from math import sqrt

def is_prime(num):
    # According to trial division we only need to check from 2 -> sqrt(num)
    for x in range(2, int(sqrt(num) + 1)):
        if num % x == 0:
             return False
    return True

sum = 2 # Start with 2 in sum because we skip it to make life easier
for x in range(3, 1000000, 2): # Don't bother checking even numbers
    if is_prime(x):
        sum += x
print("Sum: " + str(sum))

На моем компьютере это занимает около 10 секунд, чтобы найти ответ, который немного лучше, чем ваша реализация.

0
ответ дан Alexander Freyr 18 January 2019 в 05:54
поделиться

Попробуйте этот простой код, он намного быстрее вашего:)

import math

def isPrime(n):
   if n == 1:
      return False
   if n == 2:
      return True
   if n > 2 and n % 2 ==0:
      return False

   max_divisor = math.floor(math.sqrt(n))
   for d in range(3, 1 + max_divisor,2):
     if n % d ==0:
        return False
   return True

primes = [x for x in range(1,1000000) if isPrime(x) ==True]
print(sum(primes))
0
ответ дан J0KER11 18 January 2019 в 05:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: