|
[原创]请教vfbpgyfk先生一个编程问题
*请先生检查一下,下边的程序是不是对k8生成初始值31表中的生成元31字段的值进行处理(判断是否符合条件,符合的保存,
*不符合的跳过执行下一个生成元31字段中的值),程序能正常运行,按概率估算应该是2万,3万个被判值中有1个符合要求的不会被筛掉,
*可是处理了23万,24万的被判值,没有一组符合要求,在最密8生素数群中一条记录也未存上?
CLEAR
SELECT 1
USE f:\MYVFP\学习VFP\最密8生素数群.DBF ALIAS 最密8生素数
SELECT 2
USE f:\MYVFP\学习VFP\新制素数表.DBF ALIAS 新制素数
SELECT 3
USE f:\MYVFP\学习VFP\k8生成初始值31.DBF ALIAS k8生成初始值31
*INPUT "请输入预先值 K= " TO yxk
*INPUT "请输入步长值 bcz= " TO bcz
*INPUT "请输入初始值 csz= " TO csz
*INPUT "请输入外循环起始值 xks= " TO xks
*INPUT "请输入外循环终结值 zds= " TO zds
GO 41001 &&***************这条语句是将“k8生成初始值31”表的指针移到“41001”处**************
FOR h=1 TO 200000 &&注意,当复制此程序模版时一定把外循环次数改成工作区2打开表的总记录条数的值
@ 2,5 say h
SELECT k8生成初始值31
bpz=生成元31 &&计算被判断值
Kf=INT(SQRT(bpz)) &&求出被判断值的开方根
SELECT 新制素数 &&打开素数表
LOCATE FOR 素数>=kf &&根据开方根,查找最大素数
DO CASE
CASE EOF() &&如果超出素数表最后一条记录
GO BOTTOM
CASE 素数>kf &&如果找到的素数比开方根值大,就将记录指针退回一个,保证使用的最大素数在开方根内
SKIP -1
ENDCASE
SSS=RECNO() &&记录下最大素数(开方根内)记录位置(如果找到的素数等于开方根,则直接读取这个素数的位置)
GO 11 &&从第二条记录开始读取素数(37)
FOR j=11 TO SSS &&内循环开始。这个循环实质上是从小到大顺序,依次读取素数。循环值是记录序号
qmz=MOD(bpz,素数) &&以读取的素数为条件,对被判断值求模 【qmz=MOD(bpz,素数)】文本号括着的原在此行语句体部分.特别需要注意的是在用标点符号时,一定改成英文模式及半角状态。
IF qmz=0 OR qmz=6 OR qmz=8 OR qmz=14 OR qmz=18 OR qmz=20 OR qmz=24 OR qmz=26
EXIT
*************根据您的解释(我认为是对的),应该把内循环外的保存语句,放到内循环中(前面的实践已经证明运行良好的程序)
ELSE &&因为符合条件,则做完相应工作后跳出内循环
SELECT 最密8生素数 &&打开保存求解结果的信息表
APPEND BLANK &&增加一条空记录
REPLACE 外环值 WITH h &&将外循环数值保存到外循环字段中(外循环数据栏)
REPLACE 被判值 WITH bpz &&将被判断值保存到被判断值字段中(被判断值数据栏)
REPLACE 开方根 WITH kf &&将开方根保存到开方根字段中(开方根值数据栏)
SELECT k8生成初始值31
************结束保存(“*”号区内是移进来的保存信息语句部分)
ENDIF
SKIP &&素数表指针向下移动一个
ENDFOR
SKIP
ENDFOR
CLEAR ALL
*由于我没有“k8生成初始值31”表,所以,不能试运行。您按这个程序运行一下看看,结果如何,再联系。 |
|