标题:用删除法编写一个制作素数表的vfp程序
只看楼主
laowan001
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:54
帖 子:802
专家分:1914
注 册:2015-12-30
得分:3 
1.向大家介绍这个问题的解决思路
2.问大家你的解决思路是否可行
3.需要有人帮忙用程序实现你的解决方法
4.其他
不知楼主的意思是哪个
2021-09-14 09:51
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:57
帖 子:713
专家分:556
注 册:2016-6-29
得分:0 
回复 10楼 xuminxz
大概流程是那样的。当然是想让大家安照这种方法方式编写一个vfp程序,以便优化,使程序运算时间大幅度降低。一个一个的筛太慢了,我等不及,想尽快获得结果,得到数据。

素数问题的解决是我学习编程永恒的动力。
2021-09-14 11:02
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:57
帖 子:713
专家分:556
注 册:2016-6-29
得分:0 
回复 11楼 laowan001
把1至3连起来就是我的意思。

素数问题的解决是我学习编程永恒的动力。
2021-09-14 11:03
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:57
帖 子:713
专家分:556
注 册:2016-6-29
得分:0 
CLEAR
SELECT 1
USE D:\vfp温习\素数式至17表.DBF ALIAS 素数式表
SELECT 2
USE D:\vfp温习\素数表万3.DBF ALIAS 素数表万3
SELECT 3
USE D:\vfp温习\素数表亿新.DBF ALIAS 素数表亿新 &&当时仅改变了别名,没有改原名,在素数表亿新后增加了198-200周期素数,改正,并去掉了后续素数
*INPUT "请输入预先值 K= " TO yxk
*INPUT "请输入步长值 bcz= " TO bcz
*INPUT "请输入初始值 csz= " TO csz
*INPUT "请输入外循环起始值 xks= " TO xks
*INPUT "请输入外循环终结值 zds= " TO zds
bcz=510510  &&从2乘到17,即素数17的素数阶乘
kssj=SECONDS()                      &&取出开始时间
FOR i=198 TO 200
@12,10 SAY i
            &&调了下顺序,原来在FOR j=1 TO 92160 的下边,执行第一个外循环,提示已经到了表尾
FOR j=1 TO 92160
SELECT 1
GO j
sss=素数式
bpz=sss+(i-1)*bcz               &&计算被判断值
Kf=INT(SQRT(bpz))                   &&求出被判断值的开方根
SELECT 2
GO 1
COUNT ALL FOR 素数<=kf TO jlh  &&借用原来的记录号,实际上统计kf以前的素数个数
  && jlh=RECNO()
SELECT 2   
GO 7                                &&从第二条记录开始读取素数(3)
FOR k=1 TO jlh-6                     &&内循环开始。这个循环实质上是从小到大顺序,依次读取素数。循环值是记录序号
qmz=MOD(bpz,素数)                   &&以读取的素数为条件,对被判断值求模
IF qmz=0 && OR qmz=2 OR qmz=6 OR qmz=8  如果符合这四个约定条件之一,就进行相应工作.如果一个也没有符合条件的,直接使记录指针向下移动一个(SKIP)
EXIT                                &&因为符合条件,则做完相应工作后跳出内循环
ENDIF
SKIP                                &&素数表指针向下移动一个
ENDFOR
IF k>jlh-6
SELECT 3               &&打开保存求解结果的信息表
APPEND BLANK                        &&增加一条空记录
REPLACE 素数 WITH bpz && 把bpz赋给素数        
ENDIF
ENDFOR
ENDFOR
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
这是一个制作素数表程序,也用到数据源表(素数式至17表→即用素数2,3,5,7,11,13,17这7个素数处理过的数据,每一层外循环数值增加值是510510(2*3*5*7*11*13*17),中层循环为92160(2*4*6*10*12*16),最;里层循环次数不定,有被判断值的开方值前素数个数确定最大循环次数,合数循环次数都小于最大循环次数,只有质数才是满循环),只不过,这个程序是一个一个的判断,排除,筛选。
而本帖要求一次性调入92160个数据(即中循环次数),在主要循环体中,是每次都得全部未完成,并不退出循环(循环次数以最大次数为准(不考虑那一批次中最小值的循环次数))。
一个程序是一个一个的处理,一个程序是一批一批的处理,这是问题的关键。(再就是处理过程中进行速度会加快,因为每循环一次被判断的数量只减不增)。

素数问题的解决是我学习编程永恒的动力。
2021-09-14 12:13
laowan001
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:54
帖 子:802
专家分:1914
注 册:2015-12-30
得分:0 
按你上面的程序执行后,最后的结果表的记录数是276480条吗?


[此贴子已经被作者于2021-9-14 15:00编辑过]

2021-09-14 14:45
laowan001
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:54
帖 子:802
专家分:1914
注 册:2015-12-30
得分:0 
FOR i=198 TO 200
没明白为什么是198 TO 200,正常就是这样吗?
2021-09-14 14:47
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:57
帖 子:713
专家分:556
注 册:2016-6-29
得分:0 
回复 16楼 laowan001
这是程序的最后一段计算数据,整个程序是从1开始的,那只运算了2个外循环,一次外循环可以处理510510自然数段内的92160个数值。运算结果不对。

素数问题的解决是我学习编程永恒的动力。
2021-09-14 15:00
laowan001
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:54
帖 子:802
专家分:1914
注 册:2015-12-30
得分:0 
能把你的正常程序和你的有关数据表发上来,并且正确结果的记录是多少能说一下吗?
既然想让大家帮你,那就请提供尽量多的信息

实话说,具体原理估计我是没理解清楚,但可以帮你优化程序

[此贴子已经被作者于2021-9-14 15:06编辑过]

2021-09-14 15:05
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:57
帖 子:713
专家分:556
注 册:2016-6-29
得分:0 
回复 15楼 laowan001
那个数是需要处理的用数,里边有多少个素数找出来就可以了。不过,本问题不要用此程序,基本效仿把数排成一行或一列,然从素数3开始,划去其倍数,(奇数等差数列,不含1),继续划去5得倍数,一直这样划下去,直到最后一个素数倍划完为止,当然这个最后素数是本组数中最大的那个开方值前的最大素数。

素数问题的解决是我学习编程永恒的动力。
2021-09-14 15:12
laowan001
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:54
帖 子:802
专家分:1914
注 册:2015-12-30
得分:0 
既然不需要用程序,那就好
2021-09-14 15:22



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




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

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