标题:用删除法编写一个制作素数表的vfp程序
只看楼主
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:57
帖 子:713
专家分:556
注 册:2016-6-29
得分:0 
回复 129楼 sam_jiang
我的目的是通过,数据源,参照素数表,制作更大的素数表;而不是判断一个数是否为素数。

素数问题的解决是我学习编程永恒的动力。
2021-10-14 06:50
sam_jiang
Rank: 8Rank: 8
等 级:贵宾
威 望:10
帖 子:542
专家分:781
注 册:2021-10-13
得分:0 
ashuzu里就是你要的所有素数,你可以将数组传回参数就可以了,我只是演示了如何将所有的素数筛选出来,并计算了一下所需时间。

呵呵,开拓一下思路,希望对你有帮助,没有的话就算了,就当茶余饭后的消遣。
2021-10-14 08:40
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:57
帖 子:713
专家分:556
注 册:2016-6-29
得分:0 
回复 132楼 sam_jiang
我这个人是接受各种算法的,不论它的运算速度如何,统统吸纳。来强化自己编写程序的能力,只用自己的方法,永远接触不到更多的语句,命令,函数等信息。
    在这个问题上:吹水佬版主的运行速度最快,而且给提供dll文件,只不过没有用到我所提供的材料,也只能计算到32位(2^32)的2倍大,再大,就溢出了。
     而最符合题意的是:laowan001先生的,速度基本上也可以,最重要的是可以移植,嫁接到其他程序中,这是我最看重的地方。
     先生的思路,和流程图也别具一格。能不能适应更大应用就不知道了。

素数问题的解决是我学习编程永恒的动力。
2021-10-14 10:46
laowan001
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:54
帖 子:802
专家分:1914
注 册:2015-12-30
得分:0 
回复 131楼 独木星空

“我的目的是通过,数据源,参照素数表,制作更大的素数表;而不是判断一个数是否为素数”
如果把这句话分成两段来看,分号前后各一段
前一段是否可理解为:目的是制作更大的素数表?如果是这样,那可以继续看下面
如果是这样,那其实用什么方法并不重要,实现更大的素数表就行,当然方法不同效率会不同,这点可以做为取舍的依据
再看后一段,制作更大的素数表,其实结果必定是素数的集合,那判断一个数是否为素数则就是基本条件了

sam_jiang 所提出的方法可看做是一个基本方法

我是想建议:如果是为了“制作更大的素数表”,不妨多用些方法试试。

如果我的理解有误,请飘过
2021-10-14 14:10
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:57
帖 子:713
专家分:556
注 册:2016-6-29
得分:0 
编写一个程序求Q(奇数)减2的n次方其值没有素数的奇数
猜想每一个奇数(大于等于5的)都可以表示成一个素数+2^n形式,编写一个vb6程序,寻找一亿内的反例。例如1048573这个数,它小于2^20=1048576,也就是1048573-2^n这个式子中的n可以从1取到19,在这19次取值中,其结果假设没有素数,则次数是一个反例,其中有一次是素数,就不是反例,程序设计中,也可以考虑,当为真时,跳出循环,执行下一个奇数。最好先制作素数表,或许也不快,不如直接判断,比起判断一个数是否为素数要容易的多(是指运算时间上)。大概就这么个意思,有不清楚的地方,在商榷。
这是发在vb6上的一个帖子,有兴趣的做一做。

素数问题的解决是我学习编程永恒的动力。
2021-10-16 05:47
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:57
帖 子:713
专家分:556
注 册:2016-6-29
得分:0 
SELECT 1
USE D:\方程p减2的n次方\素数表.DBF ALIAS 素数表
SELECT 2
USE D:\方程p减2的n次方\奇素数表.DBF ALIAS 奇素数表
kssj=SECONDS()                      &&取出开始时间
FOR i=99 TO 9999 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
SELECT 2              &&打开保存求解结果的信息表
APPEND BLANK                        &&增加一条空记录
REPLACE 奇数 WITH i && 把bpz赋给素数   
REPLACE 参素 WITH bpz && 把bpz赋给素数
ENDIF
ENDFOR
ENDFOR
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
这是制作能被表示的奇数程序。

素数问题的解决是我学习编程永恒的动力。
2021-10-16 05:48
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:57
帖 子:713
专家分:556
注 册:2016-6-29
得分:0 
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,"运行时间提示")
这是寻找不能被表示的奇数程序。

素数问题的解决是我学习编程永恒的动力。
2021-10-16 05:49
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:57
帖 子:713
专家分:556
注 册:2016-6-29
得分:0 
回复 137楼 独木星空
在vb6版块,风吹过b版主已经给出了vb6代码。为了暂时不掩盖他的发帖,没有在那里及时回帖致谢。

素数问题的解决是我学习编程永恒的动力。
2021-10-17 06:49
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:57
帖 子:713
专家分:556
注 册:2016-6-29
得分:0 
SELECT 1
USE D:\方程p减2的n次方\素数表万.DBF ALIAS 素数表万
SELECT 2
USE D:\方程p减2的n次方\一加m表.DBF ALIAS 一加m表
kssj=SECONDS()                      &&取出开始时间
FOR i=69 TO 99 STEP 2
@12,10 SAY i
IF MOD(i,3)=0
s=3
ELSE
s=1
ENDIF
IF MOD(i,5)=0
w=5
ELSE
w=1
ENDIF
IF MOD(i,7)=0
q=7
ELSE
q=1
ENDIF
IF MOD(i,11)=0
yy=11
ELSE
yy=1
ENDIF
IF MOD(i,13)=0
ys=13
ELSE
ys=1
ENDIF
IF MOD(i,17)=0
yq=17
ELSE
yq=1
ENDIF
IF MOD(i,19)=0
yj=19
ELSE
yj=1
ENDIF
IF MOD(i,23)=0
es=23
ELSE
es=1
ENDIF
IF MOD(i,29)=0
ej=29
ELSE
ej=1
ENDIF
IF MOD(i,31)=0
sy=31
ELSE
sy=1
ENDIF
FOR j=10 TO 12000 STEP 2
@22,20 SAY j
   IF MOD(j,i)=0
   LOOP
   ENDIF
  IF MOD(j,s)=0 AND s>1
  LOOP
 ENDIF
 IF MOD(j,w)=0 AND w>1
  LOOP
 ENDIF
  IF MOD(j,q)=0 AND q>1
  LOOP
 ENDIF
  IF MOD(j,yy)=0 AND yy>1
  LOOP
 ENDIF
 IF MOD(j,ys)=0 AND ys>1
  LOOP
 ENDIF
  IF MOD(j,yq)=0 AND yq>1
  LOOP
 ENDIF
  IF MOD(j,yj)=0 AND yj>1
  LOOP
 ENDIF
 IF MOD(j,es)=0 AND es>1
  LOOP
 ENDIF
 IF MOD(j,ej)=0 AND ej>1
  LOOP
 ENDIF
 IF MOD(j,sy)=0 AND sy>1
  LOOP
 ENDIF
  SELECT 1
  GO 1
  COUNT ALL FOR 素数<=j/i TO tj
  SELECT 1
  GO 1
        FOR k=1 TO tj
        SELECT 1
        ss=素数
        jl=recno()
        pdz=j-i*ss
           SELECT 1
           GO 1
           COUNT NEXT i*tj+10 FOR 素数=pdz TO tj1  
           IF tj1=1
           EXIT
           ENDIF
         SELECT 1
        GO jl+1
        ENDFOR
   IF k>tj
   SELECT 2  
   APPEND BLANK            
   REPLACE m值 WITH i
   REPLACE n值 WITH j
   ENDIF
  ENDFOR
ENDFOR
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
这是求3-99以内方程无素解的程序,方程为x+my=N,x,y为素数,m为小于100的奇数。

素数问题的解决是我学习编程永恒的动力。
2021-10-17 06:53
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:57
帖 子:713
专家分:556
注 册:2016-6-29
得分:0 
SELECT 1
USE D:\方程p减2的n次方\素数表万.DBF ALIAS 素数表万
SELECT 2
USE D:\方程p减2的n次方\一加m表.DBF ALIAS 一加m表
kssj=SECONDS()                      &&取出开始时间
FOR i=70 TO 100 STEP 2
@12,10 SAY i
IF MOD(i,3)=0
s=3
ELSE
s=1
ENDIF
IF MOD(i,5)=0
w=5
ELSE
w=1
ENDIF
IF MOD(i,7)=0
q=7
ELSE
q=1
ENDIF
IF MOD(i,11)=0
yy=11
ELSE
yy=1
ENDIF
IF MOD(i,13)=0
ys=13
ELSE
ys=1
ENDIF
IF MOD(i,17)=0
yq=17
ELSE
yq=1
ENDIF
IF MOD(i,19)=0
yj=19
ELSE
yj=1
ENDIF
IF MOD(i,23)=0
es=23
ELSE
es=1
ENDIF
IF MOD(i,29)=0
ej=29
ELSE
ej=1
ENDIF
IF MOD(i,31)=0
sy=31
ELSE
sy=1
ENDIF
FOR j=9 TO 13999 STEP 2
@22,20 SAY j
   IF MOD(j,i)=0
   LOOP
   ENDIF
  IF MOD(j,s)=0 AND s>1
  LOOP
 ENDIF
 IF MOD(j,w)=0 AND w>1
  LOOP
 ENDIF
  IF MOD(j,q)=0 AND q>1
  LOOP
 ENDIF
  IF MOD(j,yy)=0 AND yy>1
  LOOP
 ENDIF
 IF MOD(j,ys)=0 AND ys>1
  LOOP
 ENDIF
  IF MOD(j,yq)=0 AND yq>1
  LOOP
 ENDIF
  IF MOD(j,yj)=0 AND yj>1
  LOOP
 ENDIF
 IF MOD(j,es)=0 AND es>1
  LOOP
 ENDIF
 IF MOD(j,ej)=0 AND ej>1
  LOOP
 ENDIF
 IF MOD(j,sy)=0 AND sy>1
  LOOP
 ENDIF
  SELECT 1
  GO 1
  COUNT ALL FOR 素数<=j/i TO tj
  SELECT 1
  GO 1
        FOR k=1 TO tj
        SELECT 1
        ss=素数
        jl=recno()
        pdz=j-i*ss
           SELECT 1
           GO 1
           COUNT NEXT i*tj+10 FOR 素数=pdz TO tj1  
           IF tj1=1
           EXIT
           ENDIF
         SELECT 1
        GO jl+1
        ENDFOR
   IF k>tj
   SELECT 2  
   APPEND BLANK            
   REPLACE m值 WITH i
   REPLACE n值 WITH j
   ENDIF
  ENDFOR
ENDFOR
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
这是求2-100以内方程无素解的程序,方程为x+my=N,x,y为素数,m为小于101的偶数。
laowan001先生如果看到,请把条件语句改写成数组,从素数3到31部分,跳出进入下一个,同时改写。提前向laowan001先生致谢。

素数问题的解决是我学习编程永恒的动力。
2021-10-17 06:57



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-506838-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.953774 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved