|

楼主 |
发表于 2019-3-7 22:26
|
显示全部楼层
本帖最后由 白新岭 于 2019-3-7 14:27 编辑
6分24.42秒1001到10000之间的9000*3=27000个数(计数范围弄错了,int((sssx-sss)*1.1)+10,扩大了10%),实际因为int((2*sss-sssx)*1.1)+10,它表示前后两个区间的三生素数个数的差扩大10%再+10,比起后部分来说要少很多。
CLEAR ALL
SELECT 1
USE e:\用vfp求k生素数数量\三生素数表.DBF ALIAS 三素表
SELECT 2
USE e:\用vfp求k生素数数量\三生素数合成结果.DBF ALIAS 三生合成结果
kssj=SECONDS() &&取出开始时间
For N=1001 to 10000
@ 3,6 say N
FOR M=4 TO 16 step 6
@ 4,8 say M
X=M+N*30
Y=X/2
zhz=Y &&求出偶数的中值
SELECT 三素表 &&打开三素数表
LOCATE FOR 三素>=zhz &&根据三素表,查找最大三素数
DO CASE
CASE EOF() &&如果超出三素数表最后一条记录
GO BOTTOM
CASE 三素>zhz &&如果找到三的素数中值大,就将记录指针退回一个,保证使用的最大三素数在中值内,小于等于即
SKIP -1
ENDCASE
SSS=RECNO()+1 &&记录下最大三素数(中值内)记录位置(如果找到的素数等于开方根,则直接读取这个素数的位置)
LOCATE FOR 三素>=X &&根据三素表,查找最大三素数
DO CASE
CASE EOF() &&如果超出三素数表最后一条记录
GO BOTTOM
CASE 三素>X &&如果找到三的素数中值大,就将记录指针退回一个,保证使用的最大三素数在中值内,小于等于即
SKIP -1
ENDCASE
SSSX=RECNO()+1 &&记录下最大三素数(中值内)记录位置(如果找到的素数等于开方根,则直接读取这个素数的位置)
GO 1 &&从第一条记录开始读取三素数
FOR J=1 TO SSS &&内循环开始。这个循环实质上是从小到大顺序,依次读取素数。循环值是记录序号
I=J
Z=X-三素 &&以读取的三素数为条件,对X-三素数值进行判断,看一看是否在三生素数表内
go SSSX-3-J
count next INT((2*SSS-SSSX)*1.1)+10 for Z=三素 to js
IF js>0
EXIT
ENDIF
GO I+1 &&素数表指针向下移动一个
ENDFOR
IF J>SSS
SELECT 三生合成结果 &&打开盛放素数的表
APPEND BLANK &&增加一条空记录
REPLACE 模30的偶数 WITH X &&将N值付给素数
ENDIF
ENDFOR
ENDFOR
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
CLEAR ALL
2910个反例 |
|