Пусть d(n) определяется как сумма делителей n (числа меньше n, делящие n нацело).
Если d(a) = b и d(b) = a, где a ≠ b, то a и b называются дружественной парой, а каждое из чисел a и b - дружественным числом.
Если 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)))
Функция не оптимальна, но работает быстро