标题:用删除法编写一个制作素数表的vfp程序
只看楼主
独木星空
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
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
laowan001
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:54
帖 子:802
专家分:1914
注 册:2015-12-30
得分:0 
回复 140楼 独木星空
这种情况用数组不合适,用临时表吧
没有数据无法测试

程序代码:
SELECT 1
USE D:\方程p减2的n次方\素数表万.DBF ALIAS 素数表万
SELECT 2
USE D:\方程p减2的n次方\一加m表.DBF ALIAS 一加m表
kssj=SECONDS()                      &&取出开始时间

CREATE CURSOR S31 (模数 int,值 int)
INSERT INTO S31 (模数) VALUES (3)
INSERT INTO S31 (模数) VALUES (5)
INSERT INTO S31 (模数) VALUES (7)
INSERT INTO S31 (模数) VALUES (11)
INSERT INTO S31 (模数) VALUES (13)
INSERT INTO S31 (模数) VALUES (17)
INSERT INTO S31 (模数) VALUES (19)
INSERT INTO S31 (模数) VALUES (23)
INSERT INTO S31 (模数) VALUES (29)
INSERT INTO S31 (模数) VALUES (31)

FOR i=70 TO 100 STEP 2
@12,10 SAY i
    UPDATE s31 SET=1
    UPDATE s31 SET=模数 WHERE MOD(i,模数)=0

IF .F.    && 被替代的部分
    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
ENDIF    && 被替代的部分结束

FOR j=9 TO 13999 STEP 2
@22,20 SAY j

   IF MOD(j,i)=0
       LOOP
   ENDIF

    SELECT s31
    locate for>1 AND mod(j,值)=0
    if !eof()
        loop
    endif 

IF .f.        && 被替代的部分
    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

 
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

USE IN s31    && 关闭临时表

=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 13:48编辑过]

2021-10-17 10:01
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:57
帖 子:713
专家分:556
注 册:2016-6-29
得分:0 
回复 142楼 laowan001
再次,谢谢!laowan001先生给提的建议,和改造。

素数问题的解决是我学习编程永恒的动力。
2021-10-17 12:36
laowan001
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:54
帖 子:802
专家分:1914
注 册:2015-12-30
得分:0 
142楼程序有问题,已经修改了
2021-10-17 13:49
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:57
帖 子:713
专家分:556
注 册:2016-6-29
得分:0 
这个问题可以画上句号了。因为没有人再给出新的算法。

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

素数问题的解决是我学习编程永恒的动力。
2021-10-23 23:21
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:57
帖 子:713
专家分:556
注 册:2016-6-29
得分:0 
回复 87楼 吹水佬
吹水佬版主的dll文件,在运行速度上堪称一流。但是如果这个问题,是一道高考作文题,恐怕阅卷老师,只能忍疼割爱,评个不及格分数,原因是,根本就没有用到所给的素材,全凭自己的任意发挥了,也就是说,已经跑题了。

素数问题的解决是我学习编程永恒的动力。
2021-10-23 23:27
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
以下是引用独木星空在2021-10-23 23:27:23的发言:

吹水佬版主的dll文件,在运行速度上堪称一流。但是如果这个问题,是一道高考作文题,恐怕阅卷老师,只能忍疼割爱,评个不及格分数,原因是,根本就没有用到所给的素材,全凭自己的任意发挥了,也就是说,已经跑题了。

这个dll应该是答题内容的第一段落,何来跑题?
一开始题目就不完整,表述不清晰,探讨问题无概念、无方向、无目的,试问谁会花时间去答理。
见你一直在自问自答,也不知你到底想做什么,其间就提问过几句,想理清一下思路,看看有无其他方式方法能达到相同目的算法。一落笔写下的那个dll就是这个意思。
好可惜,我真的审错题了,原来题目要求是无讨论空间,一定要按出题目人的思路走。
因方向不明、目的不确,我怕死路一条不敢走下去了。

[此贴子已经被作者于2021-10-24 11:24编辑过]

2021-10-24 05:51
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
吹水佬只会吹水,再多吹几下。
1、其实,我一直有关注这个问题,只是找不到互动交换意见讨论下去的机会。
2、有一点不明白,在VB版块也见到你提出同样的问题,想必是想用VB编程来解决问题,VB是不能直接使用你的DBF,说明你是想变通。要变通,就有可能要跑题,所以跑题未必是坏事。
3、至于你提到那个dll不能在其他模块或其他程序使用,我可以明确说明一下:只要能调用windows API的程序在任何地方都能使用这个dll。
4、至于我提到的“必要性”和“充分性”问题,如:
   只是简单地给出:2,3,5,7  那只是很有限的必要性。
   如果能给出:2,3,5,7,...,n  就能体验充分性。因没有见到这种形式的出现,所以就说是:谈不上有充分性。
   如果这个 n 没确定,对于这个问题,可以说目的就不明确,这个n对算法来说是很重要。

2021-10-24 09:44



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




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

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