Это в основном весь смысл идентификатора. :) Идентификаторы специфичны, их можно использовать только один раз на странице. Классы могут использоваться как довольные.
Сито из Эратосфена является очень простым и довольно быстрым алгоритмом теста на простоту.
Следующая реализация занимает около 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]))
Простейший тест на простоту - пробное деление: учитывая входное число n, проверьте, делит ли любое простое число m от 2 до √n поровну
blockquote>Я бы начал с определения функции, которая просто проверяет, является ли число простым или нет. Затем используйте эту функцию в цикле, который считает от 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 секунд, чтобы найти ответ, который немного лучше, чем ваша реализация.
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))