| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 10536 人关注过本帖
标题:用删除法编写一个制作素数表的vfp程序
取消只看楼主 加入收藏
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:71
帖 子:865
专家分:683
注 册: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
来 自:河北省曲阳县
等 级:版主
威 望:71
帖 子:865
专家分:683
注 册: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
来 自:河北省曲阳县
等 级:版主
威 望:71
帖 子:865
专家分:683
注 册:2016-6-29
收藏
得分:0 
回复 137楼 独木星空
在vb6版块,风吹过b版主已经给出了vb6代码。为了暂时不掩盖他的发帖,没有在那里及时回帖致谢。

素数问题的解决是我学习编程永恒的动力。
2021-10-17 06:49
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:71
帖 子:865
专家分:683
注 册: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
来 自:河北省曲阳县
等 级:版主
威 望:71
帖 子:865
专家分:683
注 册: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
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:71
帖 子:865
专家分:683
注 册: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
IF MOD(i,37)=0
sq=37
ELSE
sq=1
ENDIF
IF MOD(i,41)=0
ssy=41
ELSE
ssy=1
ENDIF
IF MOD(i,43)=0
sss=43  &&原设计为ss=43,因为主循环中,此变量已经付给素数=ss,造成多重编码变量,导致结果运行错误
ELSE
sss=1   &&同上解释
ENDIF
IF MOD(i,47)=0
ssq=47
ELSE
ssq=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
 IF MOD(j,sq)=0 AND sq>1
  LOOP
 ENDIF
 IF MOD(j,ssy)=0 AND ssy>1
  LOOP
 ENDIF
 IF MOD(j,sss)=0 AND sss>1 &&原设计为ss=43,因为主循环中,此变量已经付给素数=ss,造成多重编码变量,导致结果运行错误
  LOOP
 ENDIF
  IF MOD(j,ssq)=0 AND ssq>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,"运行时间提示")
当m为偶数时,对于大于72的偶数,需用本程序才正确。大于100后仍就不正确。
对于43这个变量名称做了调整,因为与素数=ss相同。

[此贴子已经被作者于2021-10-17 12:32编辑过]


素数问题的解决是我学习编程永恒的动力。
2021-10-17 10:00
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:71
帖 子:865
专家分:683
注 册:2016-6-29
收藏
得分:0 
回复 142楼 laowan001
再次,谢谢!laowan001先生给提的建议,和改造。

素数问题的解决是我学习编程永恒的动力。
2021-10-17 12:36
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:71
帖 子:865
专家分:683
注 册:2016-6-29
收藏
得分:0 
这个问题可以画上句号了。因为没有人再给出新的算法。

素数问题的解决是我学习编程永恒的动力。
2021-10-20 23:34
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:71
帖 子:865
专家分:683
注 册:2016-6-29
收藏
得分:0 
回复 45楼 laowan001
SELECT [ALLI DISTINCT TTOP nExpr PERCENT Select List Item L]
FROM IFORCE Table tist ItemL](WITH (BUFFERING -JExpr[oinType]JOIN DatabaseName!]Table [[AS] LocalAlias]
ION JoinCondition [ANDI OR [oinCondition i
FilterConditionl ... IWHERE JoinCondition|
FilterCondition [ANDIOR JoinCondition!
FilterCondition]..]
[GROUP BY Column_List Item [....]]
HAVING FilterCondition [ANDIOR ...JI UNION [ALLJ SELECTCommand]
IORDER BY Order Item [ASC| DESC] L...J]
[StorageDestinationDisplayDestination]
PREFERENCE PreferenceName] [NOCONSOLE IPLAINJ INOWAIT
JoinType-INNERILEFT!RIGHTIFULL [OUTER]
StorageDestination-INTO [ARRAY ArrayNameI
CURSOR CursorName[NOFILTERIREADWRITE]!TABLE TableName]
DisplayDestination-TO [FILE FileName [ADDITIVE]I PRINTER PROMPTIISCREEN]
SELECT nWorkAreacTableAlias
分界
[ all i distinct ttop nexpr percent select list item l ](with (buffering-jexpr [ ointype ] join databasename!)
合并条件,合并条件,合并条件,合并条件,合并条件![过滤条件]。.][按列列表项目[ ... ]]具有过滤条件[和... 联合[所有选择命令]按订单项目
[ asc | desc ] l。.[ storagedestationdisplaydestination ] preference preferencename ][ noconsole iplainj inowait jointype-inileft![ outer ]
storagedestination-into [ array arraynamei cursor cursorname [ nofilterireadwrite ] ![ table tablename ] displaydestination-to [ file filename [ additive ] i printer promptiiscreen ]
选择 nworkareactablealias
分界
[ALLI DISTINCT TTOP nExpr PERCENT Select List Item L]
FROM IFORCE Table tist ItemL](WITH (BUFFERING -JExpr[oinType]JOIN DatabaseName!]
所有我不同的 ttop nexpr 百分比选择列表项目 lfrom iforce 表存储项目与缓冲-jexpr ointype 连接数据库名称!
分界
[ asc | desc ] l。.[ storagedestationdisplaydestination ] preference preferencename ][ noconsole iplainj inowait jointype-inileft![ outer ]
storagedestination-into [ array arraynamei cursor cursorname [ nofilterireadwrite ] ![ table tablename ] displaydestination-to [ file filename [ additive ] i printer promptiiscreen ]
因此,选择目的地的偏好应该选择不同的控制台,不要选择等待连接类型!外部存储目的地-到数组数组名称光标修改名称 nofilterireadwrite 表格名称显示目的地-到文件名添加物 i printer promptiiscreen
这是laowan001先生算法中,所用到语句,用在线翻译,获得大概内容,仅仅一个语句,所包含的内容却很强大,无奈自己英语水平,白纸一张,翻译成汉语,倒是可以知道大概意思。

素数问题的解决是我学习编程永恒的动力。
2021-10-22 07:49
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:71
帖 子:865
专家分:683
注 册:2016-6-29
收藏
得分:0 
回复 45楼 laowan001
如果这是一道高考作文题,laowan001先生可以得100分,因为他用到了所给的提示素材,没有跑题。

素数问题的解决是我学习编程永恒的动力。
2021-10-23 23:21
快速回复:用删除法编写一个制作素数表的vfp程序
数据加载中...
 
   



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

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