Scheme 方案中的euler#7项目

Scheme 方案中的euler#7项目,scheme,racket,Scheme,Racket,有一个问题: 通过列出前六个素数 数字:2、3、5、7、11和13,我们 可以看出第六个素数是13 第10001个素数是什么 以下是我的解决方案: #lang racket (define (search-limit num) (+ (floor (sqrt num)) 1)) (define (search-list num) (stream->list (in-range 2 (search-limit num)))) (define (divided? num x)

有一个问题:

通过列出前六个素数 数字:2、3、5、7、11和13,我们 可以看出第六个素数是13

第10001个素数是什么

以下是我的解决方案:

#lang racket

(define (search-limit num)
  (+ (floor (sqrt num)) 1))

(define (search-list num)
  (stream->list (in-range 2 (search-limit num))))

(define (divided? num x)
  (= (remainder num x) 0))

(define (list-of-dividers num)
  (filter (lambda (x)
            (divided? num x))         
       (search-list num)))

(define (prime? num)
  (= (length (list-of-dividers num)) 0))

(define (problem_7 current_prime primes counter)
  (cond
    [(< primes 10001)
     (cond
       [(prime? counter) (problem_7 counter (+ primes 1) (+ counter 1))]
       [else (problem_7 current_prime primes (+ counter 1))])]
    [else current_prime]))

(problem_7 0 0 0)
#朗球拍
(定义(搜索限制数量)
(+(楼层(sqrt数量))1)
(定义(搜索列表编号)
(流->列表(范围2(搜索限制数量)))
(定义(除以?数值x)
(=(余数x)0))
(定义(分隔符列表编号)
(滤波器(λ(x)
(除以数x)
(搜索列表编号)))
(定义(素数?num)
(=(长度(除数列表))0)
(定义(问题7当前素数计数器)
(续)
[(
它可以工作,但工作缓慢。我确信有更好的解决办法。

你能给我一个更简单的解决方案吗?

合数总是有一个较小的素数作为除数;素数从来没有更小的素数作为除数。因为你是按顺序生成素数的,所以你可以利用这一事实进行素数测试,只要试着把你的候选者除以较小的素数列表就可以了。(顺便说一句,这是埃拉托斯坦筛法的一种变体。)

我采用了以下方法,在我的计算机上不到1秒(您的版本大约需要12.5秒):


当然有更快的
(prime?n)
实现,但这对我来说是个窍门

此外,您应该只测试6*K+1和6*K-1形式的数字。对于某些正整数K,每个大于3的素数都是6k+/-1。找出原因是一个有趣的小数学难题。除法中(=(余数n div)0)周围的if块?这是多余的。但我想这有点吹毛求疵,我会解决的。谢谢
#lang racket

(define (divides? n div)
  (= (remainder n div) 0))

(define (prime? n)
  (prime-helper n 2))

(define (prime-helper n start)
  (cond ((> start (sqrt n)) #t)
        ((divides? n start) #f)
        (else (prime-helper n (+ 1 start)))))

(define (prob7_helper n count)
  (cond ((= 10001 count) (- n 1))
        ((prime? n) (prob7_helper (+ 1 n) (+ 1 count)))
        (else (prob7_helper (+ 1 n) count))))

(define (prob7) (prob7_helper 2 0))

(prob7)