| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 10887 人关注过本帖
标题:用删除法编写一个制作素数表的vfp程序
只看楼主 加入收藏
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:71
帖 子:921
专家分:683
注 册:2016-6-29
收藏
得分:0 
所以主要是把主循环体的算法改进才可以,用数组代替,直接调入内存,不来回读取和存入等操作,最后一次性把还是真的存表即可。

素数问题的解决是我学习编程永恒的动力。
2021-09-16 16:07
laowan001
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:66
帖 子:1088
专家分:2682
注 册:2015-12-30
收藏
得分:0 
45楼给你的程序,运行时间已经在10分钟以里了,不知为什么还非要用你原来的程序。你这个程序的写法,运行效率也不会有大的改善

程序主循环体中的处理我已经试过使用数组方式了,运行时间差不多,所以没在这里提供
2021-09-16 16:14
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:71
帖 子:921
专家分:683
注 册:2016-6-29
收藏
得分:0 
回复 82楼 laowan001
放上来最好,供大家欣赏。我是想练习各种方法方式,比对它们的用时(说效率更贴切)。
再就是吹水佬的运算速度最快,但是没有用数据源和素数表,没有分成段落,无法移植到类似程序中去,计划移植程序中是排除两种余数以上,而不是单单是一个余数0,获得的是k生素数的一个代表值。

素数问题的解决是我学习编程永恒的动力。
2021-09-16 18:56
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:71
帖 子:921
专家分:683
注 册:2016-6-29
收藏
得分:0 
CLEAR
CLOSE DATABASES

LOCAL kkk

SELECT 1
USE d:\标记法\素数式17.DBF ALIAS 素数式17
SELECT 2
USE d:\标记法\素数表参考.DBF ALIAS 素数表参
SELECT 3
USE d:\标记法\三生素数.DBF ALIAS 三素表
DELETE ALL
PACK

SELECT 三素 数据1 FROM 三素表 WHERE 1=2 INTO CURSOR 数据a READWRITE

kssj = DATETIME()
FOR i=9901 TO 9905
    SELECT 式17+(i-1)*510510 数据1,CAST(1 as INT) 数据mod FROM 素数式17 INTO CURSOR 数据a READWRITE

    SELECT 数据a
    GO BOTTOM     
    Kf=INT(SQRT(数据1))

    SELECT 2
    kkk = 0
    SCAN FOR RECNO()>7 AND 素数<=kf
        IF RECNO()>kkk
            WAIT TRANSFORM(RECNO()) WINDOW NOWAIT NOCLEAR
            kkk = kkk + 10
        ENDIF
        
        UPDATE 数据a SET 数据mod=MOD(数据1,素数表参.素数) WHERE 数据mod<>0 and 数据mod<>4 and 数据mod<>6

        SELECT 2
    ENDSCAN
   
    INSERT INTO 三素表 (三素) SELECT 数据1 FROM 数据a WHERE 数据mod<>0 and 数据mod<>4 and 数据mod<>6
   
 ENDFOR
 USE IN 数据a
 
 MESSAGEBOX( DATETIME()-kssj)
这是简单改写了,用于求最密三生素数的程序,循环5个外循环值用时69秒(开始条件用错,条件是用or连接的,结果一个也没有筛除出去,全部留下了,进入多少,出来多少,一个也没有去掉,而且用时222秒,后来把连接条件的改为and(并且))。

素数问题的解决是我学习编程永恒的动力。
2021-09-16 19:06
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:71
帖 子:921
专家分:683
注 册:2016-6-29
收藏
得分:0 
CLEAR
CLOSE DATABASES
SELECT 1
USE d:\标记法\素数式17.DBF ALIAS 素数式17
SELECT 2
USE d:\标记法\素数表参考.DBF ALIAS 素数表参
SELECT 3
USE d:\标记法\三生素数.DBF ALIAS 三素表
DELETE ALL
PACK

SELECT 三素 数据1 FROM 三素表 WHERE 1=2 INTO CURSOR 数据a READWRITE

kssj = DATETIME()
FOR i=9906 TO 9910
@12,10 SAY i
    SELECT 式17+(i-1)*510510 数据1,CAST(1 as INT) 数据mod FROM 素数式17 INTO CURSOR 数据a READWRITE

    SELECT 数据a
    GO BOTTOM     
    Kf=INT(SQRT(数据1))

    SELECT 2
    kkk = 0
    SCAN FOR RECNO()>7 AND 素数<=kf
        
        UPDATE 数据a SET 数据mod=MOD(数据1,素数表参.素数) WHERE 数据mod<>0 and 数据mod<>4 and 数据mod<>6

        SELECT 2
    ENDSCAN
   
    INSERT INTO 三素表 (三素) SELECT 数据1 FROM 数据a WHERE 数据mod<>0 and 数据mod<>4 and 数据mod<>6
   
 ENDFOR
 USE IN 数据a
 
 MESSAGEBOX( DATETIME()-kssj)
去了显示记录条值(或者说是主体循环的循环次数),加了显示外循环值(即处理第几批次的值)。

素数问题的解决是我学习编程永恒的动力。
2021-09-16 19:17
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:71
帖 子:921
专家分:683
注 册:2016-6-29
收藏
得分:0 
CLEAR
CLOSE DATABASES
SELECT 1
USE d:\标记法\素数式至19.DBF ALIAS 素数式19
SELECT 2
USE d:\标记法\素数表参考.DBF ALIAS 素数表参
SELECT 3
USE d:\标记法\三生素数新.DBF ALIAS 三素表
DELETE ALL
PACK

SELECT 三素 数据1 FROM 三素表 WHERE 1=2 INTO CURSOR 数据a READWRITE

kssj = DATETIME()
FOR i=703 TO 705
@12,10 SAY i
    SELECT 式19+(i-1)*9699690 数据1,CAST(1 as INT) 数据mod FROM 素数式19 INTO CURSOR 数据a READWRITE

    SELECT 数据a
    GO BOTTOM     
    Kf=INT(SQRT(数据1))

    SELECT 2
   
    SCAN FOR RECNO()>8 AND 素数<=kf
        
        UPDATE 数据a SET 数据mod=MOD(数据1,素数表参.素数) WHERE 数据mod<>0 and 数据mod<>4 and 数据mod<>6

        SELECT 2
    ENDSCAN
   
    INSERT INTO 三素表 (三素) SELECT 数据1 FROM 数据a WHERE 数据mod<>0 and 数据mod<>4 and 数据mod<>6
   
 ENDFOR
 USE IN 数据a
 
 MESSAGEBOX( DATETIME()-kssj)
进一步升级,到了一步跨过9699690个自然数段,循环3次外循环,相当于上贴19*3=57个外循环,用时740秒,节省时间20多秒,不算多。

素数问题的解决是我学习编程永恒的动力。
2021-09-16 20:06
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10607
专家分:43182
注 册:2014-5-20
收藏
得分:0 
VFP写这个东东效率相对较低,简单写个DLL给VFP调用好象好点。
Prime.rar (12.74 KB)

程序代码:
cDefPath = ADDBS(JUSTPATH(SYS(16)))
SET DEFAULT TO (cDefPath)
DECLARE LONG CreatePrime IN Prime LONG,LONG,STRING@
t = SECONDS()
CreatePrime(1, 10000000, cDefPath+"Prime1.txt")
? SECONDS()-t  && 8s
t = SECONDS()
CreatePrime(10000001, 40000000, cDefPath+"Prime2.txt")
? SECONDS()-t  && 49s
2021-09-16 23:15
schtg
Rank: 12Rank: 12Rank: 12
来 自:Usa
等 级:贵宾
威 望:67
帖 子:1712
专家分:3318
注 册:2012-2-29
收藏
得分:0 
回复 87楼 吹水佬
吹版,这个很好,可分段,且很快哦!
图片附件: 游客没有浏览图片的权限,请 登录注册
2021-09-17 06:17
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:71
帖 子:921
专家分:683
注 册:2016-6-29
收藏
得分:0 
回复 87楼 吹水佬
下载了,还没有应用。谢谢吹水佬版主!

素数问题的解决是我学习编程永恒的动力。
2021-09-17 07:31
laowan001
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:66
帖 子:1088
专家分:2682
注 册:2015-12-30
收藏
得分:0 
吹版真牛,佩服!!!
2021-09-17 08:12
快速回复:用删除法编写一个制作素数表的vfp程序
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018628 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved