可以用素数表
三角数表示成 n * (2*n ± 1)
记录n的所有质数因子 很大的概率会重复
用一个函数计算质数因子所能生成的全部因子的个数
n的所有质数因子 和 2n±1有什么关系呢
可以用素数表
三角数表示成 n * (2*n ± 1)
记录n的所有质数因子 很大的概率会重复
用一个函数计算质数因子所能生成的全部因子的个数
n的所有质数因子 和 2n±1有什么关系呢
比如20 -> 1,2,4,5,10,20,如果得到2,那么肯定能得到10,不用再多计算一次
顺便问一下,这个scheme好像没有range的实现啊,另外有没有方法实现重复序列?
一般来说,「Scheme 好像没有 range 的实现」这个问题不太合适。因为 Scheme 的标准(不考虑 r6rs 的 libraries 和未来的 r7rs-large)很小,各家实现都会自己添加很多模块。SRFI 是 Scheme 社区的一个努力,会提供一些标准之外的,希望各个实现能提供的功能。一般各大实现都是 rnrs 标准 + 一些 srfi + 其他自己的模块这样。
List 相关的 srfi 主要就是 srfi-1 了,找了一下,里面有一个 iota 函数,应该是你想要的功能。另外 srfi-42 提供的 list comprehension 功能也会有帮助吧。
不太清楚「重复序列」是什么意思
(repeat 2 3) ;; (3 3)
(repeat 3) ;; (3 3 3 3.....)都是3
这个问题有点难,又去找了一下,在 srfi-41 stream(可以理解为 lazy 的 list)里有这样一个函数: stream-constant
不过和你的需求有点差别:
(stream-constant 1) ; ⇒ 1 1 1 ...
(stream-constant #t #f) ; ⇒ #t #f #t #f #t #f ...
差异可以自己处理一下。
我还想再说一句,take
在哪里
(take 1 '(1 2 3)) ;(1)
srfi-1 里应该有的,你可以先看一下它的文档
其实我早给了能降到 30ms 的方法。
完整的解法我贴在 project Euler 的论坛了