2013年7月25日木曜日

[Project Euler] Problem 1 「3と5の倍数」

10未満の自然数のうち, 3 もしくは 5 の倍数になっているものは 3, 5, 6, 9 の4つがあり, これらの合計は 23 になる.

同じようにして, 1000 未満の 3 か 5 の倍数になっている数字の合計を求めよ.
次の方針でこの問題を解きます.
  1. 1から999までの整数のリストを作ります.
  2. 作った整数のリストから3の倍数か5の倍数になっている整数を取り出します.
  3. 取り出した整数の和を求めます.
整数のリストを作るために, 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
> 

0 件のコメント:

コメントを投稿