Problem 10 » 履歴 » リビジョン 3
リビジョン 2 (Noppi, 2023/12/27 02:26) → リビジョン 3/8 (Noppi, 2023/12/27 04:04)
[ホーム](https://redmine.noppi.jp) - [[Wiki|Project Euler]] # [[Problem 10]] ```scheme #!r6rs #!chezscheme (import (chezscheme)) (define (sum-prime prime?-table) (let* ((len (vector-length prime?-table)) (index-list (iota len)) (prime?-list (vector->list prime?-table))) (fold-left (lambda (sum index prime?) (if prime? (+ sum index) sum)) 0 index-list prime?-list))) (define (eratosthenes-sub! table erase-num) answer-10 (assert (vector-ref table erase-num)) (let loop ((current (* erase-num 2))) (cond [(<= (vector-length table) current) table] [else (vector-set! table current #f) (loop (+ current erase-num))]))) (define (eratosthenes num) (let ((table (make-vector num 2000001 #t)) (count (isqrt (sub1 num)))) 2000000))) (vector-set! table 0 #f) (vector-set! table 1 #f) (let loop loop1 ((index 2) (table table)) 2)) (cond [(< count index) table] (sum-prime table)] [(vector-ref table index) (loop (let loop2 ((current (* index 2))) (cond [(< 2000000 current) (loop1 (add1 index) (eratosthenes-sub! index))] [else (vector-set! table index))] current #f) (loop2 (+ current index))]))] [else (loop (loop1 (add1 index) table)])))) (define answer-10 (sum-prime (eratosthenes 2000001))) index))])))) (printf "10: ~D~%" answer-10) ```