数学中国

 找回密码
 注册
搜索
热搜: 活动 交友 discuz
楼主: 白新岭

[原创]请教vfbpgyfk先生一个编程问题

  [复制链接]
 楼主| 发表于 2021-9-15 22:09 | 显示全部楼层
CLEAR
SELECT 1
USE D:\三生素数中项合成\素数式至17.DBF ALIAS 素数式表
SELECT 2
USE D:\三生素数中项合成\素数表十万.DBF ALIAS 素数表
SELECT 3
USE D:\三生素数中项合成\三生素数表.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=510510  &&从2乘到17,即素数17的素数阶乘
kssj=SECONDS()                      &&取出开始时间
FOR i=9551 TO 9600
@12,10 SAY i
            &&调了下顺序,原来在FOR j=1 TO 92160 的下边,执行第一个外循环,提示已经到了表尾
FOR j=1 TO 8960
@ 5,12 say j
SELECT 1
GO j
sss=式17
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 8                                &&从第二条记录开始读取素数(3)
FOR k=1 TO jlh-7                     &&内循环开始。这个循环实质上是从小到大顺序,依次读取素数。循环值是记录序号
qmz=MOD(bpz,素数)                   &&以读取的素数为条件,对被判断值求模
IF qmz=0  OR qmz=4 OR qmz=6 && qmz=8  如果符合这四个约定条件之一,就进行相应工作.如果一个也没有符合条件的,直接使记录指针向下移动一个(SKIP)
EXIT                                &&因为符合条件,则做完相应工作后跳出内循环
ENDIF
SKIP                                &&素数表指针向下移动一个
ENDFOR
IF k>jlh-7
SELECT 3               &&打开保存求解结果的信息表
APPEND BLANK                        &&增加一条空记录
REPLACE 三素中 WITH bpz-3 && 把bpz赋给素数        
ENDIF
ENDFOR
ENDFOR
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
用时:39分41.41秒
回复 支持 反对

使用道具 举报

发表于 2021-9-16 12:43 | 显示全部楼层
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,"运行时间提示")
回复 支持 反对

使用道具 举报

发表于 2021-9-16 16:10 | 显示全部楼层
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,"运行时间提示")
前后都用了一个语句代替了循环语句,也不知道,时间节约了多少。
回复 支持 反对

使用道具 举报

发表于 2021-9-16 19:08 | 显示全部楼层
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)
新方法制作三生素数程序。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-16 20:07 | 显示全部楼层
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)
回复 支持 反对

使用道具 举报

发表于 2021-9-17 05:37 | 显示全部楼层
dll文件
DLL(Dynamic Link Library)文件为动态链接库文件,又称"应用程序拓展",是软件文件类型。在Windows中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中。

当我们执行某一个程序时,相应的DLL文件就会被调用。一个应用程序可使用多个DLL文件,一个DLL文件也可能被不同的应用程序使用,这样的DLL文件被称为共享DLL文件。
回复 支持 反对

使用道具 举报

发表于 2021-9-19 09:38 | 显示全部楼层
本帖最后由 独木星空谁 于 2021-9-19 10:13 编辑

本帖内容有其它原因,删除了!抱歉!
回复 支持 反对

使用道具 举报

发表于 2021-9-19 15:41 | 显示全部楼层
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=661 TO 720
@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)
今天补加了中间的外循环:for i=661 to 720(增加量)
前几天运行了:for i=721 to 1040(1040*9699690=10087677600),运算了320个外周期。
回复 支持 反对

使用道具 举报

发表于 2021-9-19 19:22 | 显示全部楼层
CLEAR
SELECT 1
USE D:\三生素数中项合成\素数式至17.DBF ALIAS 素数式表
SELECT 2
USE D:\三生素数中项合成\素数表十万.DBF ALIAS 素数表
SELECT 3
USE D:\三生素数中项合成\三生素数表.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=510510  &&从2乘到17,即素数17的素数阶乘
kssj=SECONDS()                      &&取出开始时间
FOR i=12501 TO 12540
@12,10 SAY i
            &&调了下顺序,原来在FOR j=1 TO 92160 的下边,执行第一个外循环,提示已经到了表尾
FOR j=1 TO 8960
@ 5,12 say j
SELECT 1
GO j
sss=式17
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 8                                &&从第二条记录开始读取素数(3)
FOR k=1 TO jlh-7                     &&内循环开始。这个循环实质上是从小到大顺序,依次读取素数。循环值是记录序号
qmz=MOD(bpz,素数)                   &&以读取的素数为条件,对被判断值求模
IF qmz=0  OR qmz=4 OR qmz=6 && qmz=8  如果符合这四个约定条件之一,就进行相应工作.如果一个也没有符合条件的,直接使记录指针向下移动一个(SKIP)
EXIT                                &&因为符合条件,则做完相应工作后跳出内循环
ENDIF
SKIP                                &&素数表指针向下移动一个
ENDFOR
IF k>jlh-7
SELECT 3               &&打开保存求解结果的信息表
APPEND BLANK                        &&增加一条空记录
REPLACE 三素中 WITH bpz-3 && 把bpz赋给素数        
ENDIF
ENDFOR
ENDFOR
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
截止今天完成100亿内的三生素数制作。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-20 16:08 | 显示全部楼层
cDefPath = ADDBS(JUSTPATH(SYS(16)))
SET DEFAULT TO (cDefPath)
DECLARE LONG CreatePrime IN Prime LONG,LONG,STRING@
t = SECONDS()
CreatePrime(2670000001, 2700000000, cDefPath+"Prime90.txt")
? SECONDS()-t  && 72.825s Prime3 16.0MB
t = SECONDS()
CreatePrime(2700000001, 2730000000, cDefPath+"Prime91.txt")
? SECONDS()-t  && 89.604s Prime4 15.6MB
t = SECONDS()
CreatePrime(2730000001, 2760000000, cDefPath+"Prime92.txt")
? SECONDS()-t  && 72.825s Prime3 16.0MB
t = SECONDS()
CreatePrime(2760000001, 2790000000, cDefPath+"Prime93.txt")
? SECONDS()-t  && 89.604s Prime4 15.6MB
t = SECONDS()
CreatePrime(2790000001, 2820000000, cDefPath+"Prime94.txt")
? SECONDS()-t  && 72.825s Prime3 16.0MB
t = SECONDS()
CreatePrime(2820000001, 2850000000, cDefPath+"Prime95.txt")
? SECONDS()-t  && 89.604s Prime4 15.6MB
t = SECONDS()
CreatePrime(2850000001, 2880000000, cDefPath+"Prime96.txt")
? SECONDS()-t  && 72.825s Prime3 16.0MB
t = SECONDS()
CreatePrime(2880000001, 2910000000, cDefPath+"Prime97.txt")
? SECONDS()-t  && 89.604s Prime4 15.6MB
t = SECONDS()
CreatePrime(2910000001, 2940000000, cDefPath+"Prime98.txt")
? SECONDS()-t  && 89.604s Prime4 15.6MB
t = SECONDS()
CreatePrime(2940000001, 2970000000, cDefPath+"Prime99.txt")
? SECONDS()-t  && 72.825s Prime3 16.0MB
t = SECONDS()
CreatePrime(2970000001, 3000000000, cDefPath+"Prime100.txt")
? SECONDS()-t  && 89.604s Prime4 15.6MB
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|数学中国 ( 京ICP备05040119号 )

GMT+8, 2025-5-19 19:18 , Processed in 0.109767 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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