先把N个自然数按次序排列起来。1不是质数,也不是合数,要划去。第二个数2是质数留下来,而把2后面所有能被2整除的数都划去。2后面第一个没划去的数是3,把3留下,再把3后面所有能被3整除的数都划去。3后面第一个没划去的数是5,把5留下,再把5后面所有能被5整除的数都划去。这样一直做下去,就会把不超过N的全部合数都筛掉,留下的就是不超过N的全部质数。因为希腊人是把数写在涂腊的板上,每要划去一个数,就在上面记以小点,寻求质数的工作完毕后,这许多小点就像一个筛子,所以就形象地把埃拉托斯特尼的方法叫做“埃拉托斯特尼筛”,简称“筛法”。
For i = 0 To N
z(i) = 0
Next
'mark multiples of i
For i = 2 To N / 2
For j = 2 * i To N Step i
z(j) = 1
Next
Next
'count unmarked numbers, which are primes
Dim nbr = 0
For i = 2 To N
If z(i) = 0 Then
nbr += 1
End If
Next
其他人针对上面的一点优化
For i = 2 To N / 2
if z(i) = 0 then
For j = 2 * i To N Step i
z(j) = 1
Next
end if
Next
--------------------------------------------------
另一种算法
for i:=3 to N do
begin
ok:=true;
for j:=2 to round(sqr(i)) do
if i mod j=0 then
begin
ok:=false;
j:=round(sqr(i));
end;
if ok then writeln(i);
end;
筛法是先用上面的算法求出2到sqr(N)中的素数K个
用这些素数做筛子,存在数组S中
接下来的算法就是
for i:=round(sqr(N)) to N do
begin
ok:=true;
for j:=1 to K do
begin
if S[j]<=Round(sqr(i)) then
begin
if i mod S[K]=0 then
begin
ok:=false;
j:=K;
end;
end
else
j:=K;
end;
if ok then writeln(i);
end;
这样的时间和空间效率都优于本文的那种方法。
--------------------------------------------------------------------
个人看法最后一种从运算次数和空间上应该要优于前一种算法吧,但是前一种算法那个2 在整乘整除时都是做移位计算就可以了,而后一种的开方运算势必会导致每次运算执行指令数倍于前者,所以估计实现语言不同,两者之间可能会出现不同的差距
最后还要说的是,上面的内容全摘自他人的的blog 及留主,本人无任何版权,仅当学习笔记记录一下..