标题:用删除法编写一个制作素数表的vfp程序
只看楼主
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:57
帖 子:713
专家分:556
注 册:2016-6-29
得分:0 
CLEAR
SELECT 1
USE D:\标记法\数据源表.DBF ALIAS 数据源
SELECT 2
USE D:\标记法\素数表5万.DBF ALIAS 素数表参
SELECT 3
USE D:\标记法\数据表a.DBF ALIAS 数据a
SELECT 4
USE D:\标记法\数据表b.DBF ALIAS 数据b
SELECT 5
USE D:\标记法\素数表结果.DBF ALIAS 素数表果
                                  && bcz=510510  
kssj=SECONDS()                     
FOR i=1 TO 2
@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=素参
        IF  MOD(k,2)=1
          SELECT 4
          DELETE ALL
          PACK
          SELECT 3
          jlts1=RECCOUNT()  &&把数据a表中的记录条总数赋给变量:jlts1
          GO 1
            for h1=1  to jlts1
            sj1=数据1
            ys1=MOD(sj1,sc)
            IF ys1=0
            ELSE
            SELECT 4
            APPEND BLANK
            REPLACE 数据2 WITH sj1
            ENDIF
            SELECT 3
            SKIP
            ENDFOR
         ELSE
           SELECT 3
           DELETE ALL
           PACK
           SELECT 4
           jlts2=RECCOUNT()  &&把数据b表中的记录条总数赋给变量:jlts2
            GO 1
            for h2=1  to jlts2
            sj2=数据2
            ys2=MOD(sj2,sc)
            IF ys2=0
            ELSE
            SELECT 3
            APPEND BLANK
            REPLACE 数据1 WITH sj2
            ENDIF
            SELECT 4
            SKIP
            ENDFOR
          ENDIF
       SELECT 2
       skip  
       ENDFOR
          IF MOD(xhcs,2)=1
          SELECT 4
          jlts3=RECCOUNT()
          GO 1
          for h3=1  to jlts3
           sj3=数据2
           SELECT 5
           APPEND BLANK
           REPLACE 素数 WITH sj3
           SELECT 4
           SKIP
          ENDFOR
          ELSE
          SELECT 3
          jlts4=RECCOUNT()
          GO 1
          for h4=1  to jlts4
           sj4=数据1
           SELECT 5
           APPEND BLANK
           REPLACE 素数 WITH sj4
           SELECT 3
           SKIP
          ENDFOR
          ENDIF
 ENDFOR
 =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
这是我编写的程序,能正常运行,两周的运算时间为:29分40.24秒,在素数表结果中存储了1234399个数据,第一个1不是素数,第二个素数从3119开始的,3119前有443个素数,由1234399-1+443=1234841个素数,与以前方法制作的素数表中2*9699690=19399380内的素数个数一致,说明算法正确。
还是不满意运行时间,仍就偏大,不知道以前的方法运行时间是多少了(有空运行后再比对)。

素数问题的解决是我学习编程永恒的动力。
2021-09-14 20:44
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:57
帖 子:713
专家分:556
注 册:2016-6-29
得分:0 
运行第三第四周,用时42分48.07秒

素数问题的解决是我学习编程永恒的动力。
2021-09-14 21:35
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:57
帖 子:713
专家分:556
注 册:2016-6-29
得分:0 
CLEAR
SELECT 1
USE D:\vfp温习\素数式至19表.DBF ALIAS 素数式表
SELECT 2
USE D:\vfp温习\素数表万3.DBF ALIAS 素数表万3
SELECT 3
USE D:\vfp温习\素数表实验.DBF ALIAS 素数表 &&当时仅改变了别名,没有改原名,在素数表亿新后增加了198-200周期素数,改正,并去掉了后续素数
*INPUT "请输入预先值 K= " TO yxk
*INPUT "请输入步长值 bcz= " TO bcz
*INPUT "请输入初始值 csz= " TO csz
*INPUT "请输入外循环起始值 xks= " TO xks
*INPUT "请输入外循环终结值 zds= " TO zds
bcz=9699690 &&从2乘到17,即素数17的素数阶乘
kssj=SECONDS()                      &&取出开始时间
FOR i=1 TO 2
@12,10 SAY i
            &&调了下顺序,原来在FOR j=1 TO 92160 的下边,执行第一个外循环,提示已经到了表尾
FOR j=1 TO 1658880
@22,20 SAY j
SELECT 1
GO j
sss=素数式
bpz=sss+(i-1)*bcz               &&计算被判断值
Kf=INT(SQRT(bpz))                   &&求出被判断值的开方根
SELECT 2
GO 1
COUNT ALL FOR 素数<=kf TO jlh  &&借用原来的记录号,实际上统计kf以前的素数个数
  && jlh=RECNO()
SELECT 2   
GO 9                                &&从第二条记录开始读取素数(3)
FOR k=1 TO jlh-8                     &&内循环开始。这个循环实质上是从小到大顺序,依次读取素数。循环值是记录序号
qmz=MOD(bpz,素数)                   &&以读取的素数为条件,对被判断值求模
IF qmz=0 && OR qmz=2 OR qmz=6 OR qmz=8  如果符合这四个约定条件之一,就进行相应工作.如果一个也没有符合条件的,直接使记录指针向下移动一个(SKIP)
EXIT                                &&因为符合条件,则做完相应工作后跳出内循环
ENDIF
SKIP                                &&素数表指针向下移动一个
ENDFOR
IF k>jlh-8
SELECT 3               &&打开保存求解结果的信息表
APPEND BLANK                        &&增加一条空记录
REPLACE 素数 WITH bpz && 把bpz赋给素数        
ENDIF
ENDFOR
ENDFOR
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
一个一个的处理方法用时:65分41.26秒,明显比一个批次一个批次处理要慢的多。

素数问题的解决是我学习编程永恒的动力。
2021-09-14 22:08
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:57
帖 子:713
专家分:556
注 册:2016-6-29
得分:0 
希望大家提出优化建议。三楼有两个表,加上31楼的程序,就可以运行了。

素数问题的解决是我学习编程永恒的动力。
2021-09-15 06:03
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
回复 34楼 独木星空
可否分享成品DBF文件
2021-09-15 07:55
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:57
帖 子:713
专家分:556
注 册:2016-6-29
得分:0 
回复 35楼 吹水佬
所用到的表文件已经在3楼发出。程序也在31楼发出。您是要运行结果表文件吗?

素数问题的解决是我学习编程永恒的动力。
2021-09-15 08:13
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:57
帖 子:713
专家分:556
注 册:2016-6-29
得分:0 
回复 35楼 吹水佬
程序需要用到的五个表上传在这里(它们是自由表,已从数据库中导出,只是表明加了后缀---副表2字,其他未变动),程序在31楼,对应着稍微修改就可以用了。(路径及表名等信息)
数据表a副表.zip (893.02 KB)
数据表b副表.zip (893.03 KB)
数据源表副表.zip (2.2 MB)
素数表5万副表.zip (9.51 KB)
素数表结果副表.zip (3.65 MB)

素数问题的解决是我学习编程永恒的动力。
2021-09-15 08:27
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
回复 37楼 独木星空
感谢分享
2021-09-15 09:19
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:57
帖 子:713
专家分:556
注 册:2016-6-29
得分:0 
回复 18楼 laowan001
在31楼已经有了程序。另外在37楼所用表已经全部上传。静候您的佳音。

素数问题的解决是我学习编程永恒的动力。
2021-09-15 09:39
laowan001
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:54
帖 子:802
专家分:1914
注 册:2015-12-30
得分:0 
看到了

[此贴子已经被作者于2021-9-15 09:59编辑过]

2021-09-15 09:43



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-506838-1-1.html




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

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