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

Задача №3 Наибольший простой делитель

Условие задачи

Простые делители числа 13195 - это 5, 7, 13 и 29.
Каков самый большой делитель числа 600851475143, являющийся простым числом?

Решение

Простым числом, является натуральное число больше единицы, которое имеет 2 делителя - 1 и само себя. 
Для начала найдем все простые делители необходимого числа. 
Чтобы сократить поиск будем перебирать до квадратного корня 600851475143 округленного вверх (функцией math.ceil)
Перебор будем вести начиная с числа 3.
Если i делит число на цело, рекурсивно обращаемся к функции issimple c аргументом i. Функция issimple возвращает пустой список если число является простым. В этом случае число попадает в результирующий список
Далее остается только вернуть максимальное значение массива простых чисел, которые нацело делят число 600851475143 
Код Python
import math def issimple(a): r=math.ceil(math.sqrt(a)) lst=[] for i in range(3,r): if a%i==0: if issimple(i)==[]: lst.append(i) return lst r=issimple(600851475143) print(max(r))

Данный алгоритм можно оптимизировать, введя дополнительные проверки на четность но для данной задачи все работает быстро

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

Задача 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):   ...

Задача №5 Наименьшее кратное

Условие задачи 2520 - самое маленькое число, которое делится без остатка на все числа от 1 до 10. Какое самое маленькое число  делится нацело  на все числа от 1 до 20? Скажу сразу - не смотря на не большой диапазон чисел условия реализация этой задачи получилась громоздкой и ее выполнение занимает больше всего времени - около 90 с  несмотря на все попытки оптимизации. Решение