К основному контенту

Задача №7 10001-ое простое число

Условие задачи
    Выписав первые шесть простых чисел, получим 2, 3, 5, 7, 11 и 13. Очевидно, что 6-ое простое число - 13.
    Какое число является 10001-ым простым числом?

    Принцип ее решения очень похож на Задачу 3 (наибольший простой делитель), но ограничением будет выступать не само число, а количество чисел в словаре. 

Решение
    Для начала определим функцию определения простого числа:

def issimple(n):
    r=math.ceil(math.sqrt(n))
    for i in range(2,n):
        if n%i==0:
            return False
    return True

    Здесь аналогично задаче 3 - для оптимизации перебираем числа до квадратного корня искомого числа. Если n делится на хотя бы одно число от 2-х до корня n возвращаем false. Иначе True

Приведу полный оптимизированный текст:

import math
def issimple(n):
    r=math.ceil(math.sqrt(n))
    for i in range(2,n):
        if n%i==0:
            return False
    return True
n=5
s=[2,3]
while True:
    if issimple(n) is True:
        s.append(n)
    if len(s)==10001:
        break
    n+=2

print(s[-1])

Не смотря на все попытки дальнейшей оптимизации цикл выполняется чуть меньше 3-х минут. 
Основные принципы оптимизации: перебираем начиная с 5-ти и увеличиваем на 2 (чтобы не включать четные числа. 
Условием выхода из цикла является длина списка = 10001
Если у вас получится выполнить задачу более оптимально рад услышать ваши предложения. 

Популярные сообщения из этого блога

Задача №1 Сумма чисел, кратных 3 м и 5-ти

 . Задача №1 Если выписать все натуральные числа меньше 10, кратные 3 или 5, то получим 3, 5, 6 и 9. Сумма этих чисел - 23. Найдите сумму всех чисел меньше 1000, кратных 3 или 5. Решение

Задача 22. Очки за имена

Условие: Используйте   names.txt   (правый клик и 'Save Link/Target As...'), текстовый файл размером 46 КБ, содержащий более пяти тысяч имён. Начните с сортировки в алфавитном порядке. Затем подсчитайте алфавитные значения каждого имени и умножьте это значение на порядковый номер имени в отсортированном списке для получения количества очков имени. Например, если список отсортирован по алфавиту, имя COLIN (алфавитное значение которого 3 + 15 + 12 + 9 + 14 = 53) является 938-ым в списке. Поэтому, имя COLIN получает 938 × 53 = 49714 очков. Какова сумма очков имён в файле? Решение Повторяюсь - я не очень люблю "лингвистические" задачи, но эту постараюсь решить.

Задача 21. Дружественные числа

Пусть d( n ) определяется как сумма делителей  n  (числа меньше  n , делящие  n  нацело). Если d( a ) =  b  и d( b ) =  a , где  a  ≠  b , то  a  и  b  называются дружественной парой, а каждое из чисел  a  и  b  - дружественным числом. Например, делителями числа 220 являются 1, 2, 4, 5, 10, 11, 20, 22, 44, 55 и 110, поэтому d(220) = 284. Делители 284 - 1, 2, 4, 71, 142, поэтому d(284) = 220. Подсчитайте сумму всех дружественных чисел меньше 10000. Решение Для начала определим функцию, которая будет возвращать сумму делителей числа: def get_sum(n):     s=0     for i in range(1,n):         if n%i==0:             s+=i     return s Думаю не требует объяснений все довольно тривиально Далее определяем функцию, возвращающую список дружественных чисел до числа n:   def gen_friendlys(n):   ...