|

楼主 |
发表于 2021-6-23 17:40
|
显示全部楼层
CLEAR
SELECT 1
USE D:\vfp温习\L30十生素数表q2.DBF ALIAS 素数式表等比10
SELECT 2
USE D:\vfp温习\s3165万内素数.DBF ALIAS 素数表3165万
SELECT 3
USE D:\vfp温习\等比数列10a30q2.DBF ALIAS 等比数列10
*INPUT "请输入预先值 K= " TO yxk
*INPUT "请输入步长值 bcz= " TO bcz
*INPUT "请输入初始值 csz= " TO csz
*INPUT "请输入外循环起始值 xks= " TO xks
*INPUT "请输入外循环终结值 zds= " TO zds
kssj=SECONDS() &&取出开始时间
bcz=223092870 &&从2乘到19,即素数19的素数阶乘
FOR i=21 TO 100
@12,10 SAY i
&& SELECT 1 无论如何也解决不了已到表尾这个难题,只好把内循环,改成go j了
&& GO 1
FOR k=1 TO 101080 &&原来这里也是用的j,与主程序筛选等比k生素数冲突
@22,20 SAY k
SELECT 1
GO k
sss=素式10
bpz=sss+(i-1)*bcz &&计算被判断值
Kf=INT(SQRT(bpz)) &&求出被判断值的开方根
SELECT 2 &&打开素数表
LOCATE FOR 素数>=kf &&根据开方根,查找最大素数
DO CASE
CASE EOF() &&如果超出素数表最后一条记录
GO BOTTOM
CASE 素数>kf &&如果找到的素数比开方根值大,就将记录指针退回一个,保证使用的最大素数在开方根内
SKIP -1
ENDCASE
jlh=RECNO() &&记录下最大素数(开方根内)记录位置(如果找到的素数等于开方根,则直接读取这个素数的位置)
GO 9 &&从第二条记录开始读取素数(3)
FOR j=1 TO jlh-8 &&内循环开始。这个循环实质上是从小到大顺序,依次读取素数。循环值是记录序号
&&以读取的素数为条件,对被判断值求模
IF MOD(bpz,素数)=0 OR MOD(bpz,素数)=MOD(7680,素数) OR MOD(bpz,素数)=MOD(11520,素数) OR MOD(bpz,素数)=MOD(13440,素数) OR MOD(bpz,素数)=MOD(14400,素数) OR MOD(bpz,素数)=MOD(14880,素数) OR MOD(bpz,素数)=MOD(15120,素数) OR MOD(bpz,素数)=MOD(15240,素数) OR MOD(bpz,素数)=MOD(15300,素数) OR MOD(bpz,素数)=MOD(15330,素数) &&如果符合这四个约定条件之一,就进行相应工作.如果一个也没有符合条件的,直接使记录指针向下移动一个(SKIP)
EXIT &&因为符合条件,则做完相应工作后跳出内循环OR MOD(bpz,素数)=MOD(14880,素数)
ENDIF
SELECT 2
SKIP &&素数表指针向下移动一个
ENDFOR
IF j>jlh-8
SELECT 3 &&打开保存求解结果的信息表
APPEND BLANK &&增加一条空记录
REPLACE 素10 WITH bpz && 把bpz赋给素数
ENDIF
&& SELECT 1
&& SKIP
ENDFOR
&& SELECT 1 无论如何也解决不了已到表尾这个难题,只好把内循环,改成go j了
&& GO 1 无论加在外循环开始,还是加在内循环结束,都改变不了已到表尾这个问题
ENDFOR
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
这是一个正常运行程序,80个周期,用时513分21.78秒。 |
|