DEV Community

Discussion on: Write a script to find "Perfect Numbers"

Collapse
 
phallstrom profile image
Philip Hallstrom • Edited

Working on getting better at Clojure so thought I'd give it a shot.

(ns philip.perfect-numbers)

(defn brute-force-perfect-number? [num]
  (== num (apply + (filter #(zero? (mod num %)) (range 1 (inc (/ num 2)))))))

(time (println (take 4 (filter brute-force-perfect-number? (iterate inc' 2)))))
; (6 28 496 8128)
; "Elapsed time: 2649.69715 msecs"

(defn perfect-number? [num]
  (loop [divisor 2
         subtotal 1]
    (let [
          q (quot num divisor)
          evenly-divisible? (zero? (mod num divisor))]
    (if (>= divisor q)
      (== num subtotal)
      (recur (inc divisor) (if evenly-divisible? (+ subtotal divisor q) subtotal))))))

(time (println (take 4 (filter perfect-number? (iterate inc' 2)))))
; (6 28 496 8128)
; "Elapsed time: 66.942315 msecs"