> 1 <

Автор Сообщение

Alina26-89

Members


Статус

3 сообщений

Где: Russia
Род занятий:
Возраст:

#4917   2011-10-24 15:33 GMT+3 часа(ов)      
Здравствуйте, помогите пожалуйста решить задачу.

Два натуральных числа m и n называются дружественными, если сумма всех делителей числа n равна m, а сумма всех делителей числа m равна n. Найдите пары дружественных чисел меньших 1000. (не используя формулы Сабита и пр.) Решить требуют предпочтительно рекурсивно.

Алгоритм понятен, но с реализацией застряла уже на определении делителей

Заранее спасибо.

megamanx

Members


Статус

307 сообщений

Где: Russia
Род занятий:
Возраст:

#4928   2011-10-24 22:07 GMT+3 часа(ов)      
(defun factors (n &optional (high (/ n 2)) (m 1) (res nil))
(if (> m high) res
(factors n high (1+ m) (if (= 0 (rem n m)) (cons m res) res))))
 
(defun is-amicable(n m)
(if (= n m) nil
(and
(= (reduce #'+ (factors n)) m)
(= (reduce #'+ (factors m)) n))))
 
(defun check-all (n &optional (cur 1) (curins 1) (res nil))
(if (= cur n) res
(if (= curins n)
(check-all n (1+ cur) cur res)
(check-all n cur (1+ curins) (if (is-amicable cur curins)
(cons (cons cur curins) res)
res)))))

Здесь никакой оптимизации нет, работает медленно, но считает правильно. Если чо, стучись в скаеп через личку
I wish I'd made you angry earlier
> 1 <


Онлайн :

0 пользователь(ей), 33 гость(ей) :