在其他blog中看到的求质数的算法...数学还是很重要的...

先把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 及留主,本人无任何版权,仅当学习笔记记录一下..

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值