10未満の自然数のうち, 3 もしくは 5 の倍数になっているものは 3, 5, 6, 9 の4つがあり, これらの合計は 23 になる.
同じようにして, 1000 未満の 3 か 5 の倍数になっている数字の合計を求めよ.
次の方針でこの問題を解きます.
- 1から999までの整数のリストを作ります.
- 作った整数のリストから3の倍数か5の倍数になっている整数を取り出します.
- 取り出した整数の和を求めます.
整数のリストを作るために, SRFI 1のiotaを使います.
また, 3の倍数か5の倍数かを判定する手続きを定義します.
(require srfi/1)
(define (div-3-or-5? n)
(or (= 0 (remainder n 3))
(= 0 (remainder n 5))))
10未満の範囲で計算してみます.
ようこそ DrRacket, バージョン 5.3.3 [3m].
言語: Pretty Big; memory limit: 128 MB.
> (iota 9 1)
(1 2 3 4 5 6 7 8 9)
> (filter div-3-or-5? (iota 9 1))
(3 5 6 9)
> (apply + (filter div-3-or-5? (iota 9 1)))
23
>
正しく計算できているようです.
同様にして, 1000未満の数で計算してみます.
ようこそ DrRacket, バージョン 5.3.3 [3m].
言語: Pretty Big; memory limit: 128 MB.
> (apply + (filter div-3-or-5? (iota 999 1)))
233168
>
この問題は, 3の倍数の総和と5の倍数の総和から, 15の倍数の総和を引くことでも求められます.
ようこそ DrRacket, バージョン 5.3.3 [3m].
言語: Pretty Big; memory limit: 512 MB.
> (require srfi/1)
> (apply + (iota 333 3 3))
166833
> (apply + (iota 199 5 5))
99500
> (apply + (iota 66 15 15))
33165
> (- (+ 166833 99500) 33165)
233168
>