|

楼主 |
发表于 2019-7-14 14:50
|
显示全部楼层
CLEAR ALL
SELECT 1
USE c:\visualfoxpro项目\偶数素数对.DBF ALIAS 偶数表
SELECT 2
USE c:\visualfoxpro项目\s3165万内素数.DBF ALIAS 素数表
kssj=SECONDS() &&取出开始时间
for OU=100000000 to 100000000 STEP 2
@ 3,6 say OU
JS=0
For N=3 to ou/2 step 2
Kf1=INT(SQRT(N)) &&求出奇数的开方根
SELECT 素数表 &&打开素数表
LOCATE FOR 素数>=kf1 &&根据开方根,查找最大素数
DO CASE
CASE EOF() &&如果超出素数表最后一条记录
GO BOTTOM
CASE 素数>kf1 &&如果找到的素数比开方根值大,就将记录指针退回一个,保证使用的最大素数在开方根内
SKIP -1
ENDCASE
SSS1=RECNO() &&记录下最大素数(开方根内)记录位置(如果找到的素数等于开方根,则直接读取这个素数的位置)
GO 1 &&从第一条记录开始读取素数(3)
FOR j1=1 TO SSS1 &&内循环开始。这个循环实质上是从小到大顺序,依次读取素数。循环值是记录序号
qmz1=MOD(N,素数) &&以读取的素数为条件,对被判断值求模 【qmz=MOD(bpz,素数)】文本号括着的原在此行语句体部分.特别需要注意的是在用标点符号时,一定改成英文模式及半角状态。
IF qmz1=0
EXIT
ENDIF
SKIP &&素数表指针向下移动一个
ENDFOR
IF j1>SSS1
Kf2=INT(SQRT(OU-N)) &&求出奇数的开方根
SELECT 素数表 &&打开素数表
LOCATE FOR 素数>=kf2 &&根据开方根,查找最大素数
DO CASE
CASE EOF() &&如果超出素数表最后一条记录
GO BOTTOM
CASE 素数>kf2 &&如果找到的素数比开方根值大,就将记录指针退回一个,保证使用的最大素数在开方根内
SKIP -1
ENDCASE
SSS2=RECNO() &&记录下最大素数(开方根内)记录位置(如果找到的素数等于开方根,则直接读取这个素数的位置)
GO 1 &&从第一条记录开始读取素数(3)
FOR j2=1 TO SSS2 &&内循环开始。这个循环实质上是从小到大顺序,依次读取素数。循环值是记录序号
qmz2=MOD(OU-N,素数) &&以读取的素数为条件,对被判断值求模 【qmz=MOD(bpz,素数)】文本号括着的原在此行语句体部分.特别需要注意的是在用标点符号时,一定改成英文模式及半角状态。
IF qmz2=0
EXIT
ENDIF
SKIP &&素数表指针向下移动一个
ENDFOR
IF j2>SSS2
JS=JS+1
ENDIF
endif
ENDFOR
SELECT 偶数表 &&打开盛放素数的表
APPEND BLANK &&增加一条空记录
REPLACE 偶数 WITH OU
REPLACE 素数对 WITH JS &&将N值付给素数
endfor
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
CLEAR ALL
这是用vfp程序直接筛选素数对的程序,只不过运行有点慢,算1亿的偶数用时122分钟,太慢了。 |
|