|
[原创]请教vfbpgyfk先生一个编程问题
白新岭:您好!
我把初始值为199的也做出来啦,而且把19、109、199都合到一个表中了,经排序后,与以前的2亿内的四胞胎进行比较,除缺少5、7、11、13外,全部一致,总数量是:8096和8097。另外,如果计算初始值为19时,应该从素数3开始,否则将失去19这组。
下面把程序贴上,供参考。
************************************************************
CLEAR
SELECT 1
USE D:\nabaoj\白新岭\白新岭表.DBF EXCL ALIAS 白新岭
ZAP
SELECT 2
USE D:\nabaoj\随机素数表.DBF ALIAS 素数表
*INPUT "请输入预先值 K= " TO yxk
*INPUT "请输入步长值 bcz= " TO bcz
*INPUT "请输入初始值 csz= " TO csz
*INPUT "请输入外循环起始值 xks= " TO xks
*INPUT "请输入外循环终结值 zds= " TO zds
yxk=0
bcz=210
csz=19
kssj=SECONDS() &&取出开始时间
*FOR i=xks TO zds &&外循环开始
FOR i=0 TO 952382
@12,10 SAY i
bpz=csz+(i+yxk)*bcz &&计算被判断值
Kf=INT(SQRT(bpz)) &&求出被判断值的开方根
SELECT 素数表 &&打开素数表
LOCATE FOR 素数>=kf &&根据开方根,查找最大素数
DO CASE
CASE EOF() &&如果超出素数表最后一条记录
GO BOTTOM
CASE 素数>kf &&如果找到的素数比开方根值大,就将记录指针退回一个,保证使用的最大素数在开方根内
SKIP -1
ENDCASE
SSS=RECNO() &&记录下最大素数(开方根内)记录位置(如果找到的素数等于开方根,则直接读取这个素数的位置)
GO 2 &&从第二条记录开始读取素数(3)
FOR j=2 TO SSS &&内循环开始。这个循环实质上是从小到大顺序,依次读取素数。循环值是记录序号
qmz=MOD(bpz,素数) &&以读取的素数为条件,对被判断值求模
IF qmz=0 OR qmz=2 OR qmz=6 OR qmz=8 &&如果符合这四个约定条件之一,就进行相应工作.如果一个也没有符合条件的,直接使记录指针向下移动一个(SKIP)
EXIT &&因为符合条件,则做完相应工作后跳出内循环
ENDIF
SKIP &&素数表指针向下移动一个
ENDFOR
IF j>sss
SELECT 白新岭 &&打开保存求解结果的信息表
APPEND BLANK &&增加一条空记录
REPLACE 外环值 WITH i &&将外循环数值保存到外循环字段中(外循环数据栏)
REPLACE 被判值 WITH bpz &&将被判断值保存到被判断值字段中(被判断值数据栏)
REPLACE 开方根 WITH kf &&将开方根保存到开方根字段中(开方根值数据栏)
ENDIF
ENDFOR
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
SELECT 白新岭
BROWSE
CLEAR ALL
**************************************
注:这是初始值为19的程序,使用时,把直接赋值去掉,使用输入值也可。
如果能把取模条件规律总结出来,用计算机程序依据而行,随着判断数的增大,逐步去掉小素数,就能减少取模个数。可能使运行时间短些。
***!!使用这个程序时,请把前面打开数据表语句中的路径,改为您的机器上的路径。除此以外,复制到程序中(文件类型为.PRG),即可运行。
[br][br]-=-=-=-=- 以下内容由 vfbpgyfk 在 时添加 -=-=-=-=-
应该是这个问题,我的键盘2和1不太好用,必须使劲按。 |
|