fork download
  1. ; nearly-square divisors
  2.  
  3. (define (nsq-div1 n)
  4. (let loop ((d 1))
  5. (if (and (zero? (modulo n d))
  6. (<= n (* d d)))
  7. (list d (/ n d))
  8. (loop (+ d 1)))))
  9.  
  10. (display (nsq-div1 36)) (newline)
  11. (display (nsq-div1 60)) (newline)
  12. (display (nsq-div1 183783600)) (newline)
  13.  
  14. (define (unique eql? xs)
  15. (cond ((null? xs) '())
  16. ((null? (cdr xs)) xs)
  17. ((eql? (car xs) (cadr xs))
  18. (unique eql? (cdr xs)))
  19. (else (cons (car xs) (unique eql? (cdr xs))))))
  20.  
  21. (define (factors n)
  22. (if (even? n) (cons 2 (factors (/ n 2)))
  23. (let loop ((n n) (f 3) (fs '()))
  24. (cond ((< n (* f f)) (reverse (cons n fs)))
  25. ((zero? (modulo n f))
  26. (loop (/ n f) f (cons f fs)))
  27. (else (loop n (+ f 2) fs))))))
  28.  
  29. (define (divisors n)
  30. (define (times x) (lambda (y) (* x y)))
  31. (let divs ((fs (factors n)))
  32. (unique = (sort
  33. (if (null? fs) '(1)
  34. (let ((ds (divs (cdr fs))))
  35. (append ds (map (times (car fs)) ds)))) <))))
  36.  
  37. (define (nsq-div2 n)
  38. (let* ((divs (divisors n))
  39. (len (length divs))
  40. (b (list-ref divs (quotient (- len 1) 2))))
  41. (list (/ n b) b)))
  42.  
  43. (display (nsq-div2 36)) (newline)
  44. (display (nsq-div2 60)) (newline)
  45. (display (nsq-div2 183783600)) (newline)
Success #stdin #stdout 0.46s 8896KB
stdin
Standard input is empty
stdout
(6 6)
(10 6)
(13650 13464)
(6 6)
(10 6)
(13650 13464)