Scheme 方案中的euler#7项目
有一个问题: 通过列出前六个素数 数字:2、3、5、7、11和13,我们 可以看出第六个素数是13 第10001个素数是什么 以下是我的解决方案: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)
#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)