|

楼主 |
发表于 2021-1-27 16:06
|
显示全部楼层
SELECT 1
USE D:\循环链条新\等比素数a.dbf ALIAS 素数a &&比制作表的素数值小(即下表) 原表在条件为真时
SELECT 2
USE D:\循环链条新\等比素数b.dbf ALIAS 素数b &&即将筛除素数余数的盛放表,与上表(参考表)素数值相同 在条件为真时制造表,即新表
SELECT 3
USE D:\循环链条新\素数亿.dbf ALIAS 素数表 &&即将筛除素数余数的盛放表,与上表(参考表)素数值相同
kssj=SECONDS() &&取出开始时间
FOR n=1 TO 3
@ 5,9 say n
IF MOD(n,2)=1 &&条件为真时,由a表制作b表,a表用一个,b表用2个,a表,为1和2,1表为主;b表为3和4,3表为主表
SELECT 2
DELETE ALL
PACK
SELECT 1
go 1
do while not eof()
bpz=素a+30*6^n
Kf=INT(SQRT(bpz)) &&求出奇数的开方根
SELECT 3 &&打开素数表
LOCATE FOR 素数>=kf &&根据开方根,查找最大素数
DO CASE
CASE EOF() &&如果超出素数表最后一条记录
GO BOTTOM
CASE 素数>kf &&如果找到的素数比开方根值大,就将记录指针退回一个,保证使用的最大素数在开方根内
SKIP -1
ENDCASE
SSS=RECNO() &&记录下最大素数(开方根内)记录位置(如果找到的素数等于开方根,则直接读取这个素数的位置)
GO 1 &&从第一条记录开始读取素数(3)
FOR j=1 TO SSS &&内循环开始。这个循环实质上是从小到大顺序,依次读取素数。循环值是记录序号
qmz=MOD(bpz,素数) &&以读取的素数为条件,对被判断值求模 【qmz=MOD(bpz,素数)】文本号括着的原在此行语句体部分.特别需要注意的是在用标点符号时,一定改成英文模式及半角状态。
IF qmz=0
EXIT
ENDIF
SKIP &&素数表指针向下移动一个
ENDFOR
IF j>sss
SELECT 2 &&打开盛放素数的表
APPEND BLANK &&增加一条空记录
REPLACE 素b WITH bpz &&将N值付给素数
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
go 1
do while not eof()
bpz=素b+30*6^n
Kf=INT(SQRT(bpz)) &&求出奇数的开方根
SELECT 3 &&打开素数表
LOCATE FOR 素数>=kf &&根据开方根,查找最大素数
DO CASE
CASE EOF() &&如果超出素数表最后一条记录
GO BOTTOM
CASE 素数>kf &&如果找到的素数比开方根值大,就将记录指针退回一个,保证使用的最大素数在开方根内
SKIP -1
ENDCASE
SSS=RECNO() &&记录下最大素数(开方根内)记录位置(如果找到的素数等于开方根,则直接读取这个素数的位置)
GO 1 &&从第一条记录开始读取素数(3)
FOR j=1 TO SSS &&内循环开始。这个循环实质上是从小到大顺序,依次读取素数。循环值是记录序号
qmz=MOD(bpz,素数) &&以读取的素数为条件,对被判断值求模 【qmz=MOD(bpz,素数)】文本号括着的原在此行语句体部分.特别需要注意的是在用标点符号时,一定改成英文模式及半角状态。
IF qmz=0
EXIT
ENDIF
SKIP &&素数表指针向下移动一个
ENDFOR
IF j>sss
SELECT 1 &&打开盛放素数的表
APPEND BLANK &&增加一条空记录
REPLACE 素a WITH bpz &&将N值付给素数
ENDIF
SELECT 2
skip
enddo
endif
endfor
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
&& 这是用递归算法(或者称谓:金字塔算法)来寻找素数一阶差分等比数列程序,它比寻找最密素数式程序要简单些。 |
|