找回密码
 加入
搜索
楼主: 3mile

[效率算法] 出题:枚举N以内的质数(素数)[已解决]

 火... [复制链接]
 楼主| 发表于 2012-10-30 14:50:43 | 显示全部楼层
回复 15# zch11230
嗯,有道理哦.
我再试下还能不能提高点效率.
#include<array.au3>
Local $time = TimerInit()
Local $2nd = 1000000

Local $out = "2" & @CRLF

Local $Array[$2nd + 1]
For $i = 3 To $2nd Step 2
        $Array[$i] = True
Next

For $i = 0 To $2nd
        If $Array[$i] Then
                $out &= $i & @CRLF
                For $n = $i * $i To UBound($Array) - 1 Step $i
                        $Array[$n] = False
                Next
        EndIf
Next

$out_arr = StringSplit(StringTrimRight($out, 1), @CRLF, 1)
_ArrayDisplay($out_arr, "用时:" & TimerDiff($time))

评分

参与人数 1金钱 +40 收起 理由
Duvet + 40

查看全部评分

发表于 2012-10-30 16:09:04 | 显示全部楼层
本帖最后由 happytc 于 2012-10-30 16:10 编辑

回复 16# 3mile


    前面都是回复可见呀,不知道前面的效率怎么样?
等这个帖子回复了,看看前面的达人方法。
这种嘛,用字节码筛选法,几乎不用计算,再先申请一块内存,那个效率还不是吼吼的呀,给个一到一百万中的素数计算的,看看速度呀:我的老爷机子,计算1000000里的素数就只需要100毫秒!

当然主要想挣“三笑”的钱!
游客,如果您要查看本帖隐藏内容请回复

评分

参与人数 6金钱 +315 贡献 +12 收起 理由
lpxx + 50 赞一个!
xms77 + 30 + 2 强淫呐~~,学习一下!
Duvet + 40
3mile + 80 + 5 总算引来高手了
netegg + 35

查看全部评分

发表于 2012-10-30 16:20:11 | 显示全部楼层
只来学习,没代码,不会
 楼主| 发表于 2012-10-30 16:47:22 | 显示全部楼层
回复 18# seniors
兄台谦虚了.
发表于 2012-10-30 17:20:18 | 显示全部楼层
怎么都隐藏啊
 楼主| 发表于 2012-10-30 17:24:54 | 显示全部楼层
回复 17# happytc

happytc兄很牛啊.
呵呵,这钱给得值.
发表于 2012-10-31 04:51:03 | 显示全部楼层
不懂的路过,顺便看看各位源码
发表于 2012-10-31 07:24:32 | 显示全部楼层
断网3天, 没赶上'盛会' 啊.
游客,如果您要查看本帖隐藏内容请回复


主要回复一下,学习学习!

评分

参与人数 2金钱 +90 收起 理由
Duvet + 40
3mile + 50 学习了

查看全部评分

发表于 2012-10-31 09:20:30 | 显示全部楼层
思来想去,只有笨办法,就不拿出来了。
进来学习。
发表于 2012-10-31 14:35:06 | 显示全部楼层
本帖最后由 zch11230 于 2012-10-31 14:36 编辑

我勒个去 17楼的 计算1亿都只需要6秒,是我1万倍的效率啊。
发表于 2012-10-31 15:37:26 | 显示全部楼层
学习一下老大们的方法,我的老方法就不发源码了
发表于 2012-10-31 18:26:14 | 显示全部楼层
回复  happytc

happytc兄很牛啊.
呵呵,这钱给得值.
3mile 发表于 2012-10-30 17:24



    呵,一般这类计算,就是要“不计算”效率才高,只要一计算,无论你修改多好的算法,都会随着着N的增大,时间复杂度和空间复杂度都会正比例增大(还好,不是几何级数增涨)。

象下面这种,就耗时了

$iMaxNum = 1000000
$hInit = TimerInit()
$sPrimes = PrimeNumCalc($iMaxNum)
$iTimer = TimerDiff($hInit)

MsgBox(0,"计算耗时", "计算" & $iMaxNum & "内的所有素数共耗时:" & $iTimer & " 毫秒")
MsgBox(0,"素数",$sPrimes)


Func PrimeNumCalc($iN)
    Local $p[$iN + 1], $i, $j, $z, $n
        
    For $z = 3 To $iN Step 2
        $p[$z] = 1
    Next
    For $i = 3 To Sqrt($iN) Step 2
        If $p[$i] And Mod($p[$i], 2) Then
            For $j = $i * $i To $iN Step $i
                $p[$j] = 0
            Next
            $n &= $i & " "
        EndIf
    Next
    If Not Mod($i, 2) Then $i += 1
    For $z = $i To $iN Step 2
        If $p[$z] Then $n &= $z & " "
    Next
    Return "2 " & $n
EndFunc 

评分

参与人数 3金钱 +120 贡献 +5 收起 理由
Duvet + 40
1007236046 + 30 高,这算法快
3mile + 50 + 5 胜读十年书啊

查看全部评分

发表于 2012-11-1 22:10:36 | 显示全部楼层
来学习了,最近没时间玩autoit,手痒了~
发表于 2012-11-2 19:09:05 | 显示全部楼层
厲害
學習了
发表于 2012-11-3 11:37:51 | 显示全部楼层
回复 27# happytc
这个改成step 2*$i 也能提效率
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-4-19 06:30 , Processed in 0.085360 second(s), 21 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表