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

Задача 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):
    res=[]
    for i in range(1,n):
        if i not in res:
            tmp=get_sum(i)
            if i==get_sum(tmp) and i!=tmp:
                res.append(i)
                res.append(tmp)
    return res
Список res является списком дружественных чисел. В цикле for перебираем числа от 1 до n. Если число не в res проверяем на "дружественность - суммируем в tmp делители числа i и сравниваем сумму делителей i с суммой делителей tmp, также проверяем чтобы i не было = tmp. При выполнении 2-х условий записываем i и tmp в список res.
Далее осталось вызвать нашу функцию:

print(sum(gen_friendlys(10000)))

Функция не оптимальна, но работает быстро

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

Задача №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.app

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

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