|

楼主 |
发表于 2021-2-14 20:04
|
显示全部楼层
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 9064 &&最外一层嵌套
@ 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 &&从素数23开始,因为初始表是建立在素数式至19的基础上
FOR n=1 TO 6 &&第二层嵌套
@ 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
SELECT 1
zjl1qb=RECCOUNT() &&当参考余数表中的余数种类少于过关素数时,整表照搬
GO 1
FOR ccb1sj=1 TO zjl1qb &&重抄表1数据
ccsa=素a
SELECT 3
APPEND BLANK
REPLACE 素b WITH ccsa &&改成本次追加记录的字段
SELECT 1
SKIP
endfor
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
SELECT 3
zjl3qb=RECCOUNT() &&当参考余数表中的余数种类少于过关素数时,整表照搬
GO 1
FOR ccb1sj=1 TO zjl3qb &&重抄表1数据
ccsb=素b
SELECT 1
APPEND BLANK
REPLACE 素a WITH ccsb &&改成本次追加记录的字段
SELECT 3
SKIP
endfor
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,"运行时间提示")
这是制作素数式链条的完美版(以前发过类似的帖子,只不过这是以素数式至19为基础)。 |
|