数学中国

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

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

  [复制链接]
 楼主| 发表于 2021-2-6 11:41 | 显示全部楼层
SELECT 1
USE D:\循环链条新\素数式至19.dbf ALIAS 素数式
SELECT 2
USE D:\循环链条新\二生元等比.dbf ALIAS 二生元
kssj=SECONDS()    &&取出开始时间
SELECT 1
GO 1
FOR i=1 TO 1658878
  @ 5,9 say i
          q=素19
          jlz=RECNO()  &&记住指针所在位置
          count NEXT 2 for 素19-q=2 to js2  &&改成将要制作参考表的字段名,即表2中的字段名
           IF js2=1
           SELECT 2
           APPEND BLANK
           REPLACE 头式2 WITH q &&改成本次追加记录的字段
           REPLACE 记录值2 WITH jlz
           ENDIF
           SELECT 1
           go jlz+1
   ENDFOR
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
制作等比生成元。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-6 11:54 | 显示全部楼层
SELECT 1
USE D:\循环链条新\素数式至19.dbf ALIAS 素数式
SELECT 2
USE D:\循环链条新\二生元等比.dbf ALIAS 二生元
SELECT 3
USE D:\循环链条新\三生元等比.dbf ALIAS 三生元
kssj=SECONDS()    &&取出开始时间
FOR i=1 TO 378669
  @ 5,9 say i
          SELECT 2
          zzwz=记录值2 && zzwz是指针位置
          SELECT 1
          GO zzwz
          q=素19
          jlz=RECNO()  &&记住指针所在位置
          count NEXT 5 for 素19-q=6 to js2  &&改成将要制作参考表的字段名,即表2中的字段名
           IF js2=1
           SELECT 3
           APPEND BLANK
           REPLACE 头式3 WITH q &&改成本次追加记录的字段
           REPLACE 记录值3 WITH jlz &&改成本次追加记录的字段
           ENDIF
           SELECT 2
           SKIP
   ENDFOR
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
在二生元基础继续加码,产生三生元等比元素。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-6 12:03 | 显示全部楼层
SELECT 1
USE D:\循环链条新\素数式至19.dbf ALIAS 素数式
SELECT 2
USE D:\循环链条新\三生元等比.dbf ALIAS 三生元
SELECT 3
USE D:\循环链条新\四生元等比.dbf ALIAS 四生元
kssj=SECONDS()    &&取出开始时间
FOR i=1 TO 143350
  @ 5,9 say i
          SELECT 2
          zzwz=记录值3 && zzwz是指针位置
          SELECT 1
          GO zzwz
          q=素19
          jlz=RECNO()  &&记住指针所在位置
          count NEXT 7 for 素19-q=14 to js2  &&改成将要制作参考表的字段名,即表2中的字段名
           IF js2=1
           SELECT 3
           APPEND BLANK
           REPLACE 头式4 WITH q &&改成本次追加记录的字段
           REPLACE 记录值4 WITH jlz &&改成本次追加记录的字段
           ENDIF
           SELECT 2
           SKIP
   ENDFOR
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
继续加码(其实算法一样一,没有改变)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-8 11:44 | 显示全部楼层
SELECT 1
USE D:\循环往复\素数a不余.dbf ALIAS 素数a  &&比制作表的素数值小(即下表)        原表在条件为真时
SELECT 2
USE D:\循环往复\素数a余数参考.dbf ALIAS 素数a余数 &&比上边已筛除的素数值要大  在条件为假时参考表
SELECT 3
USE D:\循环往复\素数b不余.dbf ALIAS 素数b  &&即将筛除素数余数的盛放表,与上表(参考表)素数值相同   在条件为真时制造表,即新表
SELECT 4
USE D:\循环往复\素数b余数参考.dbf ALIAS 素数b余数 &&比上边已筛除的素数值要大         在条件为真时参考表
SELECT 5
USE D:\循环往复\素数表.dbf ALIAS 素数表参 &&即将筛除素数余数的盛放表,与上表(参考表)素数值相同
kssj=SECONDS()   &&取出开始时间
SELECT 5
GO 7 &&从素数37开始
FOR n=1 TO 10
ss=素数
IF MOD(n,2)=1 &&条件为真时,由a表制作b表,a表用一个,b表用2个,a表,为1和2,1表为主;b表为3和4,3表为主表
SELECT 3
DELETE ALL
PACK
SELECT 4
DELETE ALL
pack
SELECT 1   
GO 1            
   FOR i=1 TO 1000 &&这个范围远远超过出现最后一个余数的记录条数
    A=素a &&改成表1的字段名
    jlz=RECNO()  &&记住指针所在位置
    SELECT 4
    jlzs2=RECCOUNT()  &&核对表2记录条总数
    IF jlzs2=ss &&改成将要制作参考表的素数值,即表2中的素数值
    exit
    ENDIF
    ys=MOD(A,ss) &&改成将要制作参考表的素数值,即表2中的素数值
    SELECT 4
           count all for ys=余数b to js  &&改成将要制作参考表的字段名,即表2中的字段名
           IF js=0
          SELECT 4
          APPEND BLANK
          REPLACE 余数b WITH ys &&改成本次追加记录的字段名,即表2的字段名
          REPLACE 记录值 WITH jlz
          ENDIF
          SELECT 1
          skip
   ENDFOR
   SELECT 4
   GO ss
   DELETE NEXT 1
   pack
SELECT 1
GO 1
   &&jlzs1=RECCOUNT()  核对表2记录条总数            
  DO WHILE NOT EOF() && FOR i=1 TO jlzs1  &&循环次数改成,SELECT 1 的总记录条数
    A=素a  &&设成表1的字段名
    ys=MOD(A,ss) &&对3表的素数求余数
    SELECT 4
           count all for ys=余数b to js
           IF js=1
          SELECT 3
          APPEND BLANK
          REPLACE 素b WITH A &&改成本次追加记录的字段
          ENDIF
          SELECT 1
          skip
   ENDDO
   
ELSE  &&条件为假时,由b表制作a表,b表用一个,a表用2个  (a表,为1和2,1表为主;b表为3和4,3表为主表)
SELECT 1
DELETE ALL
PACK
SELECT 2
DELETE ALL
pack

SELECT 3  
GO 1            
   FOR i=1 TO 1000 &&这个范围远远超过出现最后一个余数的记录条数
    A=素b &&改成表1的字段名
    jlz=RECNO()  &&记住指针所在位置
    SELECT 2
    jlzs2=RECCOUNT()  &&核对表2记录条总数
    IF jlzs2=ss &&改成将要制作参考表的素数值,即表2中的素数值
    exit
    ENDIF
    ys=MOD(A,ss) &&改成将要制作参考表的素数值,即表2中的素数值
    SELECT 2
           count all for ys=余数a to js  &&改成将要制作参考表的字段名,即表2中的字段名
           IF js=0
          SELECT 2
          APPEND BLANK
          REPLACE 余数a WITH ys &&改成本次追加记录的字段名,即表2的字段名
          REPLACE 记录值 WITH jlz
          ENDIF
          SELECT 3
          skip
   ENDFOR
   SELECT 2
   GO ss
   DELETE NEXT 1
   pack
SELECT 3
GO 1
   &&jlzs1=RECCOUNT()  核对表2记录条总数            
  DO WHILE NOT EOF() && FOR i=1 TO jlzs1  &&循环次数改成,SELECT 1 的总记录条数
    A=素b  &&设成表1的字段名
    ys=MOD(A,ss) &&对3表的素数求余数
    SELECT 2
           count all for ys=余数a to js
           IF js=1
          SELECT 1
          APPEND BLANK
          REPLACE 素a WITH A &&改成本次追加记录的字段
          ENDIF
          SELECT 3
          skip
   ENDDO
   ENDIF
   SELECT 5 && 外循环是选择素数表
   skip
   endfor
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
真假变身替代法寻找最密素数式(前边已有类同程序),主要在下一步,判断是否为真的最密素数式(截止倒数第二个余数出现的k条记录)。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-8 12:21 | 显示全部楼层
SELECT 1
USE D:\循环往复\素数a不余.dbf ALIAS 素数a  &&比制作表的素数值小(即下表)        原表在条件为真时
SELECT 2
USE D:\循环往复\素数a余数参考.dbf ALIAS 素数a余数 &&比上边已筛除的素数值要大  在条件为假时参考表
SELECT 3
USE D:\循环往复\素数式余数种类.dbf ALIAS 余数种类  &&即将筛除素数余数的盛放表,与上表(参考表)素数值相同   在条件为真时制造表,即新表
SELECT 4
USE D:\循环往复\素数表.dbf ALIAS 素数表 &&比上边已筛除的素数值要大  在条件为假时参考表
kssj=SECONDS()   &&取出开始时间
SELECT 4
GO 1 &&从素数37开始
FOR n=1 TO 30
ss=素数

SELECT 2
DELETE ALL
PACK

SELECT 1   
GO 1            
   FOR i=1 TO 130 &&这个范围远远超过出现最后一个余数的记录条数
    A=素a &&改成表1的字段名
        && jlz=RECNO()  记住指针所在位置
    ys=MOD(A,ss) &&改成将要制作参考表的素数值,即表2中的素数值
    SELECT 2
           count all for ys=余数a to js  &&改成将要制作参考表的字段名,即表2中的字段名
           IF js=0
          SELECT 2
          APPEND BLANK
          REPLACE 余数a WITH ys &&改成本次追加记录的字段名,即表2的字段名
          && REPLACE 记录值 WITH jlz
          ENDIF
          SELECT 1
          skip
     ENDFOR
         SELECT 2
         zls=RECCOUNT()
          SELECT 3
          APPEND BLANK
          REPLACE 素数 WITH ss &&改成本次追加记录的字段
          REPLACE 余数种类 WITH zls &&改成本次追加记录的字段
         
          SELECT 4
          skip
   endfor
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-8 12:44 | 显示全部楼层
SELECT 1
USE D:\循环往复\素数a不余.dbf ALIAS 素数a不余
SELECT 2
USE D:\循环往复\素数a不余截前断.dbf ALIAS 素数a截前断
kssj=SECONDS()                      &&取出开始时间
   SELECT 1
   go 1
   FOR  j=1 TO 124
      sa=素a
          SELECT 2
          APPEND BLANK
          REPLACE 素a WITH sa &&改成本次追加记录的字段
          SELECT 1
          skip
   ENDFOR
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
抄录一部分
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-9 11:22 | 显示全部楼层
SELECT 1
USE D:\循环往复\素数式至11.dbf ALIAS 素数式11
SELECT 2
USE D:\循环往复\标记同跨度k生数.dbf ALIAS 同跨度
kssj=SECONDS()                      &&取出开始时间
   SELECT 1
   go 1
   FOR  j=1 TO 480
      s11=式11
      jlz=recno()  &&记住位置
        kd=0 && 开始时,给kd赋值为0
        jll=0 &&记录条累计,即下边循环了几次
             do while kd<=420
             SELECT 1
             ssyd=式11
             kd=ssyd-s11
             jll=jll+1
             SELECT 1
             skip
             enddo
        SELECT 2
        APPEND BLANK
        REPLACE 跨度 WITH 420 &&改成本次追加记录的字段
        REPLACE 记录条 WITH jll
        REPLACE 起始号 WITH jlz
     SELECT 1
     go  jlz+1
   ENDFOR
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
标记同跨度的素数式(起始位置,及跨过的记录条数)。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-9 14:01 | 显示全部楼层
SELECT 1
USE D:\循环往复\素数a不余.dbf ALIAS 素数a  &&比制作表的素数值小(即下表)        原表在条件为真时
SELECT 2
USE D:\循环往复\素数a余数参考.dbf ALIAS 素数a余数 &&比上边已筛除的素数值要大  在条件为假时参考表
SELECT 3
USE D:\循环往复\素数b不余.dbf ALIAS 素数b  &&即将筛除素数余数的盛放表,与上表(参考表)素数值相同   在条件为真时制造表,即新表
SELECT 4
USE D:\循环往复\素数b余数参考.dbf ALIAS 素数b余数 &&比上边已筛除的素数值要大         在条件为真时参考表
SELECT 5
USE D:\循环往复\素数表.dbf ALIAS 素数表参 &&即将筛除素数余数的盛放表,与上表(参考表)素数值相同
SELECT 6
USE D:\循环往复\素数式至11.dbf ALIAS 素数式11  &&比制作表的素数值小(即下表)    原表在条件为真时
SELECT 7
USE D:\循环往复\标记同跨度k生数.dbf ALIAS 同跨度  &&比制作表的素数值小(即下表)    原表在条件为真时
SELECT 8
USE D:\循环往复\素数式链条.dbf ALIAS 素数式链  &&比制作表的素数值小(即下表)    原表在条件为真时
kssj=SECONDS()   &&取出开始时间
SELECT 5
GO 8 &&从素数37开始
FOR n=1 TO 30
ss=素数
IF MOD(n,2)=1 &&条件为真时,由a表制作b表,a表用一个,b表用2个,a表,为1和2,1表为主;b表为3和4,3表为主表
SELECT 3
DELETE ALL
PACK
SELECT 4
DELETE ALL
pack
SELECT 1   
GO 1            
   FOR i=1 TO 10000 &&这个范围远远超过出现最后一个余数的记录条数
    A=素a &&改成表1的字段名
    jlz=RECNO()  &&记住指针所在位置
    SELECT 4
    jlzs2=RECCOUNT()  &&核对表2记录条总数
    IF jlzs2=ss &&改成将要制作参考表的素数值,即表2中的素数值
    exit
    ENDIF
    ys=MOD(A,ss) &&改成将要制作参考表的素数值,即表2中的素数值
    SELECT 4
           count all for ys=余数b to js  &&改成将要制作参考表的字段名,即表2中的字段名
           IF js=0
          SELECT 4
          APPEND BLANK
          REPLACE 余数b WITH ys &&改成本次追加记录的字段名,即表2的字段名
          REPLACE 记录值 WITH jlz
          ENDIF
          SELECT 1
          skip
   ENDFOR
   SELECT 4
   GO ss
   DELETE NEXT 1
   pack
SELECT 1
GO 1
   &&jlzs1=RECCOUNT()  核对表2记录条总数            
  DO WHILE NOT EOF() && FOR i=1 TO jlzs1  &&循环次数改成,SELECT 1 的总记录条数
    A=素a  &&设成表1的字段名
    ys=MOD(A,ss) &&对3表的素数求余数
    SELECT 4
           count all for ys=余数b to js
           IF js=1
          SELECT 3
          APPEND BLANK
          REPLACE 素b WITH A &&改成本次追加记录的字段
          ENDIF
          SELECT 1
          skip
   ENDDO
   
ELSE  &&条件为假时,由b表制作a表,b表用一个,a表用2个  (a表,为1和2,1表为主;b表为3和4,3表为主表)
SELECT 1
DELETE ALL
PACK
SELECT 2
DELETE ALL
pack

SELECT 3  
GO 1            
   FOR i=1 TO 10000 &&这个范围远远超过出现最后一个余数的记录条数
    A=素b &&改成表1的字段名
    jlz=RECNO()  &&记住指针所在位置
    SELECT 2
    jlzs2=RECCOUNT()  &&核对表2记录条总数
    IF jlzs2=ss &&改成将要制作参考表的素数值,即表2中的素数值
    exit
    ENDIF
    ys=MOD(A,ss) &&改成将要制作参考表的素数值,即表2中的素数值
    SELECT 2
           count all for ys=余数a to js  &&改成将要制作参考表的字段名,即表2中的字段名
           IF js=0
          SELECT 2
          APPEND BLANK
          REPLACE 余数a WITH ys &&改成本次追加记录的字段名,即表2的字段名
          REPLACE 记录值 WITH jlz
          ENDIF
          SELECT 3
          skip
   ENDFOR
   SELECT 2
   GO ss
   DELETE NEXT 1
   pack
SELECT 3
GO 1
   &&jlzs1=RECCOUNT()  核对表2记录条总数            
  DO WHILE NOT EOF() && FOR i=1 TO jlzs1  &&循环次数改成,SELECT 1 的总记录条数
    A=素b  &&设成表1的字段名
    ys=MOD(A,ss) &&对3表的素数求余数
    SELECT 2
           count all for ys=余数a to js
           IF js=1
          SELECT 1
          APPEND BLANK
          REPLACE 素a WITH A &&改成本次追加记录的字段
          ENDIF
          SELECT 3
          skip
   ENDDO
   ENDIF
   SELECT 5 && 外循环是选择素数表
   skip
   endfor
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
这是制作素数式的一个雏形,仅仅在真假替换变身的基础上,加了几个表,接下来要对它进行改造,大的框架是在其外面再套一层嵌套,其目的是制作素数a不余的初始数据,在外循环的尾部加输出语句,储存处理结果(把通过素数检验的素数式抄录下来,以便进入下一个外循环处理);中间循环主题,也要稍作改动,不再寻找最后一个素数式出现位置,而是变成把素数式全部处理一下,如果满了,则去掉最后一个余数所对应的全部余数(素数式),如果没有满圆,就按原样传递下去,执行下一个,知道达到规定的素数检验即可过关,然后把结果抄录出来。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-10 10:50 | 显示全部楼层
SELECT 1
USE D:\循环往复\素数a不余.dbf ALIAS 素数a  &&比制作表的素数值小(即下表)        原表在条件为真时
SELECT 2
USE D:\循环往复\素数a余数参考.dbf ALIAS 素数a余数 &&比上边已筛除的素数值要大  在条件为假时参考表
SELECT 3
USE D:\循环往复\素数b不余.dbf ALIAS 素数b  &&即将筛除素数余数的盛放表,与上表(参考表)素数值相同   在条件为真时制造表,即新表
SELECT 4
USE D:\循环往复\素数b余数参考.dbf ALIAS 素数b余数 &&比上边已筛除的素数值要大         在条件为真时参考表
SELECT 5
USE D:\循环往复\素数表.dbf ALIAS 素数表参 &&即将筛除素数余数的盛放表,与上表(参考表)素数值相同
SELECT 6
USE D:\循环往复\素数式至11.dbf ALIAS 素数式11  &&比制作表的素数值小(即下表)    原表在条件为真时
SELECT 7
USE D:\循环往复\标记同跨度k生数.dbf ALIAS 同跨度  &&比制作表的素数值小(即下表)    原表在条件为真时
SELECT 8
USE D:\循环往复\素数式链条.dbf ALIAS 素数式链  &&比制作表的素数值小(即下表)    原表在条件为真时
kssj=SECONDS()   &&取出开始时间
SELECT 5
GO 8 &&从素数37开始
FOR n=1 TO 60
@ 5,10 say n
ss=素数
IF MOD(n,2)=1 &&条件为真时,由a表制作b表,a表用一个,b表用2个,a表,为1和2,1表为主;b表为3和4,3表为主表
SELECT 3
DELETE ALL
PACK    &&这步要用到3,4表,所以清空它们
SELECT 4
DELETE ALL
pack   &&这步要用到3,4表,所以清空它们
SELECT 1  
  zjl1=RECCOUNT()  &&把素数a不余的记录条数赋给变量zjl1
   GO 1            
   FOR i=1 TO zjl1 &&这个范围远远超过出现最后一个余数的记录条数
    A=素a &&改成表1的字段名
    jlz=RECNO()  &&记住指针所在位置
    SELECT 1  &&进入循环开始已经把表3,4清空了,所以无法满足条件,形同虚设,不过今天有了用处,可以判断记录条数与素数的大小关系,决定是否跳出循环
    jlzs2=RECCOUNT()  &&核对表2记录条总数
    IF jlzs2<ss &&改成将要制作参考表的素数值,即表2中的素数值(以前是等于号,不知道基于什么,现在也想不起原先的设计思路)
    exit  &&判断总记录条是否小于待过关素数,如果小于就跳出循环
    ENDIF
    ys=MOD(A,ss) &&改成将要制作参考表的素数值,即表2中的素数值
    SELECT 4
           count all for ys=余数b to js  &&改成将要制作参考表的字段名,即表2中的字段名
           IF js=0
          SELECT 4
          APPEND BLANK
          REPLACE 余数b WITH ys &&改成本次追加记录的字段名,即表2的字段名
          REPLACE 记录值 WITH jlz
          ENDIF
          SELECT 1
          skip
   ENDFOR
   SELECT 4
   zjl4=RECCOUNT()  &&把表4的记录条数赋给变量zjl4
   
   if zjl4<ss
        else
   GO ss
   DELETE NEXT 1
   pack
   SELECT 1
    GO 1
   &&jlzs1=RECCOUNT()  核对表2记录条总数            
    DO WHILE NOT EOF() && FOR i=1 TO jlzs1  &&循环次数改成,SELECT 1 的总记录条数
    A=素a  &&设成表1的字段名
    ys=MOD(A,ss) &&对3表的素数求余数
    SELECT 4
           count all for ys=余数b to js
           IF js=1
          SELECT 3
          APPEND BLANK
          REPLACE 素b WITH A &&改成本次追加记录的字段
          ENDIF
          SELECT 1
          skip
       ENDDO
      endif
   
ELSE  &&条件为假时,由b表制作a表,b表用一个,a表用2个  (a表,为1和2,1表为主;b表为3和4,3表为主表)

SELECT 1
DELETE ALL
PACK    &&这步要用到1,2表,所以清空它们
SELECT 2
DELETE ALL
pack   &&这步要用到1,2表,所以清空它们

SELECT 3
  zjl3=RECCOUNT()  &&把素数a不余的记录条数赋给变量zjl1
    GO 1            
   FOR i=1 TO zjl3 &&这个范围远远超过出现最后一个余数的记录条数
     A=素b &&改成表1的字段名
    jlz=RECNO()  &&记住指针所在位置
    SELECT 3
    jlzs2=RECCOUNT()  &&核对表2记录条总数
    IF jlzs2<ss &&改成将要制作参考表的素数值,即表2中的素数值
    exit
    ENDIF
    ys=MOD(A,ss) &&改成将要制作参考表的素数值,即表2中的素数值
    SELECT 2
           count all for ys=余数a to js  &&改成将要制作参考表的字段名,即表2中的字段名
           IF js=0
          SELECT 2
          APPEND BLANK
          REPLACE 余数a WITH ys &&改成本次追加记录的字段名,即表2的字段名
          REPLACE 记录值 WITH jlz
          ENDIF
          SELECT 3
          skip
   ENDFOR
   
   SELECT 2
   zjl2=RECCOUNT()  &&把表2的记录条数赋给变量zjl2
   if zjl2<ss
        else
         GO ss
         DELETE NEXT 1
         pack
        SELECT 3
        GO 1
        &&jlzs1=RECCOUNT()  核对表2记录条总数            
        DO WHILE NOT EOF() && FOR i=1 TO jlzs1  &&循环次数改成,SELECT 1 的总记录条数
         A=素b  &&设成表1的字段名
         ys=MOD(A,ss) &&对3表的素数求余数
         SELECT 2
           count all for ys=余数a to js
           IF js=1
          SELECT 1
          APPEND BLANK
          REPLACE 素a WITH A &&改成本次追加记录的字段
          ENDIF
          SELECT 3
          skip
         ENDDO
         endif
         
   ENDIF
   SELECT 5 && 外循环是选择素数表
   skip
   endfor
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
在真假变身替换的基础上,基本上解决了素数式占类满圆情况,即至少有一个余数类不会出现(对于任意素数而言),在此基础上只需要加一个外循环,把判断素数式逐个导入即可,运算结果保留。大功告成
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-10 15:10 | 显示全部楼层
SELECT 1
USE D:\循环往复\素数a不余.dbf ALIAS 素数a  &&比制作表的素数值小(即下表)        原表在条件为真时
SELECT 2
USE D:\循环往复\素数a余数参考.dbf ALIAS 素数a余数 &&比上边已筛除的素数值要大  在条件为假时参考表
SELECT 3
USE D:\循环往复\素数b不余.dbf ALIAS 素数b  &&即将筛除素数余数的盛放表,与上表(参考表)素数值相同   在条件为真时制造表,即新表
SELECT 4
USE D:\循环往复\素数b余数参考.dbf ALIAS 素数b余数 &&比上边已筛除的素数值要大         在条件为真时参考表
SELECT 5
USE D:\循环往复\素数表.dbf ALIAS 素数表参 &&即将筛除素数余数的盛放表,与上表(参考表)素数值相同
SELECT 6
USE D:\循环往复\素数式至19.dbf ALIAS 素数式19  &&比制作表的素数值小(即下表)    原表在条件为真时
SELECT 7
USE D:\循环往复\标记同跨度k生数.dbf ALIAS 同跨度  &&比制作表的素数值小(即下表)    原表在条件为真时
SELECT 8
USE D:\循环往复\素数式链条.dbf ALIAS 素数式链  &&比制作表的素数值小(即下表)    原表在条件为真时
kssj=SECONDS()   &&取出开始时间
SELECT 7
go 1
for scxh=1 to 9  &&最外一层嵌套
  @ 15,20 say scxh
qsh=起始号
jlt=记录条
SELECT 1
DELETE ALL
PACK    &&下步要制作1表,所以清空,不留数据
    SELECT 6
    go qsh
    s11d=式19 &&这里定个橛子,下边循环一周减它形成素数式
          for  j=1  to  jlt
          s11b=式19  &&给变量s11b赋值(s代表式,11代表至11的素数式,b是变的第一个字母)
           sss=s11b-s11d
           SELECT 1
           APPEND BLANK
          REPLACE 素a WITH sss
          SELECT 6
          skip
         endfor
      
  SELECT 5
  GO 8 &&从素数37开始
FOR n=1 TO 19   &&第二层嵌套
@ 5,10 say n
ss=素数
      IF MOD(n,2)=1 &&条件为真时,由a表制作b表,a表用一个,b表用2个,a表,为1和2,1表为主;b表为3和4,3表为主表
               SELECT 3
               DELETE ALL
               PACK    &&这步要用到3,4表,所以清空它们
               SELECT 4
               DELETE ALL
               pack   &&这步要用到3,4表,所以清空它们
               SELECT 1  
              zjl1=RECCOUNT()  &&把素数a不余的记录条数赋给变量zjl1
              GO 1            
              FOR i=1 TO zjl1 &&这个范围远远超过出现最后一个余数的记录条数
              A=素a &&改成表1的字段名
              jlz=RECNO()  &&记住指针所在位置
              SELECT 1  &&进入循环开始已经把表3,4清空了,所以无法满足条件,形同虚设,不过今天有了用处,可以判断记录条数与素数的大小关系,决定是否跳出循环
              jlzs2=RECCOUNT()  &&核对表2记录条总数
              IF jlzs2<ss &&改成将要制作参考表的素数值,即表2中的素数值(以前是等于号,不知道基于什么,现在也想不起原先的设计思路)
              exit  &&判断总记录条是否小于待过关素数,如果小于就跳出循环
              ENDIF
              ys=MOD(A,ss) &&改成将要制作参考表的素数值,即表2中的素数值
              SELECT 4
               count all for ys=余数b to js  &&改成将要制作参考表的字段名,即表2中的字段名
               IF js=0
               SELECT 4
               APPEND BLANK
               REPLACE 余数b WITH ys &&改成本次追加记录的字段名,即表2的字段名
               REPLACE 记录值 WITH jlz
               ENDIF
               SELECT 1
               skip
               ENDFOR
               SELECT 4
               zjl4=RECCOUNT()  &&把表4的记录条数赋给变量zjl4
   
               if zjl4<ss
               else
               GO ss
               DELETE NEXT 1
               pack
               SELECT 1
               GO 1
                &&jlzs1=RECCOUNT()  核对表2记录条总数            
                DO WHILE NOT EOF() && FOR i=1 TO jlzs1  &&循环次数改成,SELECT 1 的总记录条数
                A=素a  &&设成表1的字段名
                ys=MOD(A,ss) &&对3表的素数求余数
                SELECT 4
                count all for ys=余数b to js
                IF js=1
                SELECT 3
                APPEND BLANK
                REPLACE 素b WITH A &&改成本次追加记录的字段
                ENDIF
                SELECT 1
                skip
                ENDDO
                endif
   
        ELSE  &&条件为假时,由b表制作a表,b表用一个,a表用2个  (a表,为1和2,1表为主;b表为3和4,3表为主表)

                SELECT 1
                DELETE ALL
                PACK    &&这步要用到1,2表,所以清空它们
                SELECT 2
                DELETE ALL
                pack   &&这步要用到1,2表,所以清空它们

                SELECT 3
                zjl3=RECCOUNT()  &&把素数a不余的记录条数赋给变量zjl1
                GO 1            
                FOR i=1 TO zjl3 &&这个范围远远超过出现最后一个余数的记录条数
                A=素b &&改成表1的字段名
                jlz=RECNO()  &&记住指针所在位置
                SELECT 3
                jlzs2=RECCOUNT()  &&核对表2记录条总数
                IF jlzs2<ss &&改成将要制作参考表的素数值,即表2中的素数值
                 exit
                 ENDIF
                  ys=MOD(A,ss) &&改成将要制作参考表的素数值,即表2中的素数值
                  SELECT 2
                  count all for ys=余数a to js  &&改成将要制作参考表的字段名,即表2中的字段名
                  IF js=0
                   SELECT 2
                   APPEND BLANK
                   REPLACE 余数a WITH ys &&改成本次追加记录的字段名,即表2的字段名
                   REPLACE 记录值 WITH jlz
                   ENDIF
                   SELECT 3
                   skip
                   ENDFOR
   
                   SELECT 2
                   zjl2=RECCOUNT()  &&把表2的记录条数赋给变量zjl2
                   if zjl2<ss
                      else
                      GO ss
                     DELETE NEXT 1
                     pack
                    SELECT 3
                    GO 1
                    &&jlzs1=RECCOUNT()  核对表2记录条总数            
                    DO WHILE NOT EOF() && FOR i=1 TO jlzs1  &&循环次数改成,SELECT 1 的总记录条数
                    A=素b  &&设成表1的字段名
                    ys=MOD(A,ss) &&对3表的素数求余数
                    SELECT 2
                    count all for ys=余数a to js
                    IF js=1
                    SELECT 1
                    APPEND BLANK
                   REPLACE 素a WITH A &&改成本次追加记录的字段
                   ENDIF
                   SELECT 3
                   skip
                   ENDDO
                   endif
         
           ENDIF
           SELECT 5 && 外循环是选择素数表
           skip
           endfor   &&第二层嵌套
   
     IF MOD(n,2)=1
          SELECT 3
         zjl3f=RECCOUNT()
          go 1
          for m=1 to zjl3f
          sssf=素b
          SELECT 8
          APPEND BLANK
          REPLACE 素数式 WITH sssf
          SELECT 3
          skip
          endfor
         
      else
            
             SELECT 1
             zjl1f=RECCOUNT()
             go 1
              for g=1 to zjl1f
              sssf=素a
              SELECT 8
              APPEND BLANK
              REPLACE 素数式 WITH sssf
              SELECT 1
              skip
             endfor
       endif
      
SELECT 7
  skip
  endfor      最外一层嵌套
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
虽然还有些缺陷,不过总算完成了任务。刚改制完成时,因为for  j=1 to jlz  中参变量用了两个j,只做了一次外循环就停止了,我认为for与endfor可能不配对,加了个endfor,结果程序提示嵌套错误,后来,改了格式,进行缩进梯形显示,结果完全配对,后来发现变量用了同一个字母,导致没有进行下次外
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-15 08:51 , Processed in 0.106888 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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