|

楼主 |
发表于 2019-6-16 12:38
|
显示全部楼层
本帖最后由 白新岭 于 2019-6-16 06:39 编辑
制作1亿内的素数表用时57分13.76秒。网上有用20多秒完成10亿内的素数(是记录素数个数,不知道是否存储素数),更夸张的有想用10秒解决问题。
SELECT 1
USE F:\k生素数\s3165万内素数.DBF ALIAS 素数表
SELECT 2
USE F:\k生素数\素数表1亿.DBF ALIAS 素数表亿
SELECT 3
USE F:\k生素数\素数式至19.DBF ALIAS 生成元
kssj=SECONDS()
For N=1 to 11
@ 5,12 say N
SELECT 3
go 1
for m=1 to 1658880
bpz=素数式19+(N-1)*9699690
Kf=INT(SQRT(bpz)) &&求出奇数的开方根
SELECT 1 &&打开素数表
LOCATE FOR 素数>=kf &&根据开方根,查找最大素数
DO CASE
CASE EOF() &&如果超出素数表最后一条记录
GO BOTTOM
CASE 素数>kf &&如果找到的素数比开方根值大,就将记录指针退回一个,保证使用的最大素数在开方根内
SKIP -1
ENDCASE
SSS=RECNO() &&记录下最大素数(开方根内)记录位置(如果找到的素数等于开方根,则直接读取这个素数的位置)
GO 8 &&从第一条记录开始读取素数(3)
FOR j=1 TO SSS-7 &&内循环开始。这个循环实质上是从小到大顺序,依次读取素数。循环值是记录序号
qmz=MOD(bpz,素数) &&以读取的素数为条件,对被判断值求模 【qmz=MOD(bpz,素数)】文本号括着的原在此行语句体部分.特别需要注意的是在用标点符号时,一定改成英文模式及半角状态。
IF qmz=0
EXIT
ENDIF
SKIP &&素数表指针向下移动一个
ENDFOR
IF j>sss-7 &&这里修改过,原先没有-7,一个素数也未得到,所以加了-7
SELECT 2 &&打开盛放素数的表
APPEND BLANK &&增加一条空记录
REPLACE 素数 WITH bpz &&将N值付给素数
ENDIF
SELECT 3
skip
ENDFOR
endfor
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
这是用vfp写的程序。 |
|