在关注此链接后prime number in Groovy我看到了以下代码(在评论中):
def t = (0..10000).flatten()
t[0]=0; t[1]=0; // 0 and 1 are not prime
def L = Math.sqrt(t.size()-1)
( [2,(3..L).step(2)].flatten()).each { n ->
if(t[n]) {
def delta = n==2?1:2;
(((n*n)..(t.size())).step(n*delta)).each {
i -> t[i] = 0
}
}
}
println t.findAll({ it != 0 })
这段代码的特别之处在于它更快。我运行这个片段来找到10亿的素数,它可以在不到一分钟的时间内完成工作。但同时也无法弄清楚这是如何运作的。谁能说我这是怎么回事?
答案 0 :(得分:4)
它做的是重复遍历所有数字的数组,最多1000个,将每个先前找到的素数的所有倍数标记为非素数(通过将数组条目设置为0表示),然后过滤掉所有归零的条目
答案 1 :(得分:0)
大脑破坏了这种算法(我甚至无法验证它是否准确!)
数学
任何可以被x除以y的数字,x和y中的一个必须是< =比根。 因此你只需要筛选根,因为其他除数已经被覆盖
所有非素数必须是x素数的乘积(如果它的任何除数不是素数,它将具有非1和非自身除数)*你不需要筛选非素数的倍数
语法上,我更喜欢只声明x = [],然后如果它是out则分配1,如果它是素数则保留为null。加上我喜欢使用'it',多个声明也会很好,而且更多惯用的inject()和