| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 10537 人关注过本帖
标题:用删除法编写一个制作素数表的vfp程序
取消只看楼主 加入收藏
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:71
帖 子:865
专家分:683
注 册:2016-6-29
收藏
得分:0 
回复 45楼 laowan001
CLEAR
SELECT 1
USE D:\标记法\数据源表.DBF ALIAS 数据源
SELECT 2
USE D:\标记法\素数表5万.DBF ALIAS 素数表参
SELECT 3
USE D:\标记法\数据表a.DBF ALIAS 数据a
SELECT 5
USE D:\标记法\素数表结果1.DBF ALIAS 素数表果
kssj=SECONDS()                     
FOR i=11 TO 12
   @12,10 SAY i
   SELECT 3
   DELETE ALL &&因为此表将写入新的数据,所以提前清空数据,即记录条值
   PACK
   SELECT 1
   GO 1
   FOR j=1 TO 1658880
   sss=素数式
   dclz=sss+(i-1)*9699690  &&dclz是待处理值
   SELECT 3
   APPEND BLANK
   REPLACE 数据1 WITH dclz
   SELECT 1
   SKIP
   ENDFOR
      SELECT 3
      GO 1658880
      bpz=数据1
      Kf=INT(SQRT(bpz))
      GO 1
      SELECT 2
      GO 1
      COUNT ALL FOR 素参<=kf TO jlh  && jlh=RECNO()
      xhcs=jlh-8 &&xhcs是循环次数的简写(第一个字母代替)
      SELECT 2   
      GO 9
        FOR k=1 TO xhcs
         sc=素参
            SELECT 3
            jlts1=RECCOUNT()  &&把数据a表中的记录条总数赋给变量:jlts1
            GO 1
            FOR h1=1  to jlts1
            sj1=数据1
            ys1=MOD(sj1,sc)
            IF ys1=0
            SELECT 3
            DELETE next 1
            ENDIF
            SELECT 3
            SKIP
            ENDFOR
            SELECT 3
            PACK
        SELECT 2
        skip  
        ENDFOR
      
       INSERT INTO 素数表果 (素数) SELECT 数据1 FROM 数据a
 ENDFOR
 =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")   计算11,12两个区间用时27分58:53秒
这次只是把存表部分改动了一下(即程序最后部分),开始部分没有修改成功,不是别名被占用,就是找不到列“素数式”(英文符号单引号)。
主要循环体还没有用数组代替在内存中运算(或许这是提速的关键)。

素数问题的解决是我学习编程永恒的动力。
2021-09-16 12:42
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:71
帖 子:865
专家分:683
注 册:2016-6-29
收藏
得分:0 
回复 59楼 laowan001
SELECT 素数式+(i-1)*9699690 数据1 FROM 数据源 INTO CURSOR 数据a READWRITE
用此语句代替后,一直也不能正常运行(包括关闭数据,无论放到什么位置),不是提示别名被占用,就是找不到列“素数式”,后来还出现其他对话框(定位表文件,选择定位数据源不正确,选择定位数据a不正确,二者应选其一,那个也不正确)。
最后把别名改成了表原名,可以了,不再有其他提示,不过第一步就说超出记录范围,干脆把go 1658880去掉,直接用i*9699690代替最大开方值,只进行了一步,go 1也超出记录范围,啊?,数据a里边没有任何记录条。
所以我怀疑那条语句并没有把数据源中的值+(i-1)*9699690后改写到数据a中。

素数问题的解决是我学习编程永恒的动力。
2021-09-16 15:41
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:71
帖 子:865
专家分:683
注 册:2016-6-29
收藏
得分:0 
回复 59楼 laowan001
CLEAR
close database
SELECT 1
USE D:\标记法\数据源表.DBF ALIAS 数据源A
SELECT 2
USE D:\标记法\素数表5万.DBF ALIAS 素数表参
SELECT 3
USE D:\标记法\数据表a.DBF ALIAS 数据A
SELECT 5
USE D:\标记法\素数表结果.DBF ALIAS 素数表果
kssj=SECONDS()                     
FOR i=11 TO 12
   @12,10 SAY i
       SELECT 3
       DELETE ALL &&因为此表将写入新的数据,所以提前清空数据,即记录条值
       PACK
      INSERT INTO 数据A (数据1) SELECT 素数式+(i-1)*9699690 FROM 数据源A && 素数式+(i-1)*9699690 数据1 FROM  数据源表 INTO CURSOR 数据表a READWRITE  &&select list item 选择列表项,之前它不管,[ ,...]应该是字段名用逗号隔开
      SELECT 3
      bpz=i*9699690
      Kf=INT(SQRT(bpz))
      GO 1
      SELECT 2
      GO 1
      COUNT ALL FOR 素参<=kf TO jlh  && jlh=RECNO()
      xhcs=jlh-8 &&xhcs是循环次数的简写(第一个字母代替)
      SELECT 2   
      GO 9
        FOR k=1 TO xhcs
         sc=素参
            SELECT 3
            jlts1=RECCOUNT()  &&把数据a表中的记录条总数赋给变量:jlts1
            GO 1
            FOR h1=1  to jlts1
            sj1=数据1
            ys1=MOD(sj1,sc)
            IF ys1=0
            SELECT 3
            DELETE next 1
            ENDIF
            SELECT 3
            SKIP
            ENDFOR
            SELECT 3
            PACK
        SELECT 2
        skip  
        ENDFOR
      
            SELECT 3
            jlts2=RECCOUNT()  &&把数据a表中的记录条总数赋给变量:jlts1
            GO 1
            FOR h2=1  to jlts2
            sj2=数据1
            SELECT 5
            APPEND BLANK
            REPLACE 素数 WITH sj2
            SELECT 3
            SKIP
            ENDFOR
 ENDFOR
 =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
那个语句无法应用,把那部分用最后的语句,改写了下,能正常运行,用时28分27:93秒,也不知道时间是否减少了。

素数问题的解决是我学习编程永恒的动力。
2021-09-16 16:04
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:71
帖 子:865
专家分:683
注 册:2016-6-29
收藏
得分:0 
所以主要是把主循环体的算法改进才可以,用数组代替,直接调入内存,不来回读取和存入等操作,最后一次性把还是真的存表即可。

素数问题的解决是我学习编程永恒的动力。
2021-09-16 16:07
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:71
帖 子:865
专家分:683
注 册:2016-6-29
收藏
得分:0 
回复 82楼 laowan001
放上来最好,供大家欣赏。我是想练习各种方法方式,比对它们的用时(说效率更贴切)。
再就是吹水佬的运算速度最快,但是没有用数据源和素数表,没有分成段落,无法移植到类似程序中去,计划移植程序中是排除两种余数以上,而不是单单是一个余数0,获得的是k生素数的一个代表值。

素数问题的解决是我学习编程永恒的动力。
2021-09-16 18:56
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:71
帖 子:865
专家分: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
帖 子:865
专家分: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
帖 子:865
专家分: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: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:71
帖 子:865
专家分:683
注 册:2016-6-29
收藏
得分:0 
回复 87楼 吹水佬
下载了,还没有应用。谢谢吹水佬版主!

素数问题的解决是我学习编程永恒的动力。
2021-09-17 07:31
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:71
帖 子:865
专家分:683
注 册:2016-6-29
收藏
得分:0 
回复 87楼 吹水佬
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  && 7.953s 文本文件prime1 5.61MB
t = SECONDS()
CreatePrime(10000001, 40000000, cDefPath+"Prime2.txt")
? SECONDS()-t  && 50.209s  文本文件prime2  16.8MB
这次在电脑上运行时间与吹水佬版主的相当,再次谢谢吹水佬版主!

素数问题的解决是我学习编程永恒的动力。
2021-09-17 19:16
快速回复:用删除法编写一个制作素数表的vfp程序
数据加载中...
 
   



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

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