27 lines
761 B
Racket
27 lines
761 B
Racket
#lang racket
|
|
(require math/number-theory)
|
|
|
|
(define (sum-of-digits n)
|
|
(let inr ((n n) (s 0))
|
|
(if (zero? n) s (let-values (([q r] (quotient/remainder n 10))) (inr q (+ s r))))))
|
|
|
|
(define (smith-number? n)
|
|
(and (not (prime? n))
|
|
(= (sum-of-digits n)
|
|
(for/sum ((pe (in-list (factorize n))))
|
|
(* (cadr pe) (sum-of-digits (car pe)))))))
|
|
|
|
(module+ test
|
|
(require rackunit)
|
|
(check-equal? (sum-of-digits 0) 0)
|
|
(check-equal? (sum-of-digits 33) 6)
|
|
(check-equal? (sum-of-digits 30) 3)
|
|
|
|
(check-true (smith-number? 166)))
|
|
|
|
(module+ main
|
|
(let loop ((ns (filter smith-number? (range 1 (add1 10000)))))
|
|
(unless (null? ns)
|
|
(let-values (([l r] (split-at ns (min (length ns) 15))))
|
|
(displayln l)
|
|
(loop r)))))
|