![]() |
#2
独木星空2021-10-16 05:40
SELECT 1
USE D:\方程p减2的n次方\素数表.DBF ALIAS 素数表 SELECT 2 USE D:\方程p减2的n次方\奇数表.DBF ALIAS 奇数表 kssj=SECONDS() &&取出开始时间 FOR i=9999 TO 99999 STEP 2 @12,10 SAY i zs=INT(LOG(i)/LOG(2)) FOR j=1 TO zs @22,20 SAY j bpz=i-2^j &&计算被判断值 Kf=INT(SQRT(bpz)) &&求出被判断值的开方根 SELECT 1 &&打开素数表 LOCATE FOR 素数>=kf &&根据开方根,查找最大素数 DO CASE CASE EOF() &&如果超出素数表最后一条记录 GO BOTTOM CASE 素数>kf &&如果找到的素数比开方根值大,就将记录指针退回一个,保证使用的最大素数在开方根内 SKIP -1 ENDCASE jlh=RECNO() SELECT 1 &&记录下最大素数(开方根内)记录位置(如果找到的素数等于开方根,则直接读取这个素数的位置) GO 1 &&从第二条记录开始读取素数(3) FOR k=1 TO jlh &&内循环开始。这个循环实质上是从小到大顺序,依次读取素数。循环值是记录序号 qmz=MOD(bpz,素数) &&以读取的素数为条件,对被判断值求模 IF qmz=0 && OR qmz=2 OR qmz=6 OR qmz=8 如果符合这四个约定条件之一,就进行相应工作.如果一个也没有符合条件的,直接使记录指针向下移动一个(SKIP) EXIT &&因为符合条件,则做完相应工作后跳出内循环 ENDIF SKIP &&素数表指针向下移动一个 ENDFOR IF k>jlh exit ENDIF ENDFOR IF j>zs SELECT 2 &&打开保存求解结果的信息表 APPEND BLANK &&增加一条空记录 REPLACE 奇数 WITH i && 把bpz赋给素数 endif ENDFOR =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示") 这是用vfp语言编写的寻找不能被表示的奇数。 |
猜想每一个奇数(大于等于5的)都可以表示成一个素数+2^n形式,编写一个vb6程序,寻找一亿内的反例。例如1048573这个数,它小于2^20=1048576,也就是1048573-2^n这个式子中的n可以从1取到19,在这19次取值中,其结果假设没有素数,则次数是一个反例,其中有一次是素数,就不是反例,程序设计中,也可以考虑,当为真时,跳出循环,执行下一个奇数。最好先制作素数表,或许也不快,不如直接判断,比起判断一个数是否为素数要容易的多(是指运算时间上)。大概就这么个意思,有不清楚的地方,在商榷。