标题:问什么不执行最外层循环
取消只看楼主
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:57
帖 子:713
专家分:556
注 册:2016-6-29
结帖率:100%
 问题点数:0 回复次数:4 
问什么不执行最外层循环
CLEAR ALL
SELECT 1
USE c:\visualfoxpro项目\素数表万.DBF ALIAS 万素
SELECT 2
USE c:\visualfoxpro项目\素数生成元.DBF ALIAS 生成元
SELECT 3
USE c:\visualfoxpro项目\素数62个周期.DBF ALIAS 素数62周
    kssj=SECONDS()                      &&取出开始时间
   For N=1 to 2
        SELECT 生成元
        DO WHILE NOT EOF()
            bpz=素数式+N*510510
            Kf=INT(SQRT(bpz))       &&求出奇数的开方根
            SELECT  万素             &&打开素数表
            LOCATE FOR 素数万>=kf      &&根据开方根,查找最大素数
            DO CASE
                CASE EOF()          &&如果超出素数表最后一条记录
                        GO BOTTOM
                CASE 素数万>kf     &&如果找到的素数比开方根值大,就将记录指针退回一个,保证使用的最大素数在开方根内
                        SKIP -1
            ENDCASE
            SSS=RECNO()    &&记录下最大素数(开方根内)记录位置(如果找到的素数等于开方根,则直接读取这个素数的位置)
            GO 1           &&从第一条记录开始读取素数(3)
            FOR j=1 TO SSS       &&内循环开始。这个循环实质上是从小到大顺序,依次读取素数。循环值是记录序号
                qmz=MOD(bpz,素数万)   &&以读取的素数为条件,对被判断值求模 【qmz=MOD(bpz,素数)】文本号括着的原在此行语句体部分.特别需要注意的是在用标点符号时,一定改成英文模式及半角状态。
                IF qmz=0
                        EXIT         
                ENDIF
                SKIP            &&素数表指针向下移动一个
            ENDFOR
            IF j>sss
                SELECT  素数62周       &&打开盛放素数的表
                APPEND BLANK                        &&增加一条空记录
                REPLACE 素数 WITH bpz            &&将N值付给素数
          ENDIF
         SELECT  生成元
        skip
       ENDdo
   endfor
   =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
CLEAR ALL

开始时,我是把N=0 TO 1,仅仅是执行了一次循环,用时10分36.02秒,我认为是把初始值赋0的原因;当第二次用N=1 TO 2 时,还是仅完成了一次循环,用了N=1的值,没有N=2的情况,可用时是20分25.83秒,是原来的一倍,问什么不是循环2次呢?(在结果表中没有N=2的素数值)
搜索更多相关主题的帖子: 循环 SELECT 素数 开方 记录 
2019-03-01 16:48
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:57
帖 子:713
专家分:556
注 册:2016-6-29
得分:0 
我把N=2 to 4又试一下,还是仅执行了一次(只执行了N=2的情况),没有再进入下一个循环,用时17分19.07秒,到底如何更正才能完成外循环语句呢?

[此贴子已经被作者于2019-3-1 17:34编辑过]


素数问题的解决是我学习编程永恒的动力。
2019-03-01 17:33
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:57
帖 子:713
专家分:556
注 册:2016-6-29
得分:0 
我想用10000内的素数表制作3165万内的素数表,最内层的语句就是判断一个数是不是素数,从里往外的第二层嵌套是调取已经制作好能产生素数的序列(有不被2,3,5,7,11,13,17整除的数构成,其范围是从1到510509之间,不是每个奇数,共有92160个数据,步长是510510,即不被整除的素数积),最外一层嵌套是让程序每次完成多少个周期,一个周期是510510,有n*510510+生成元(它是已经制作好的表,放着92160个整数,它们有共同的性质,都不能整除素数2,3,5,7,11,13,17)

不知道我把问题是否说清楚了。

素数问题的解决是我学习编程永恒的动力。
2019-03-02 09:17
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:57
帖 子:713
专家分:556
注 册:2016-6-29
得分:0 
从新产生的素数可以看出仅执行了一次外循环,没有再执行剩下的外循环,因为我改了,初始值和终值,结果都是初始值执行了(从运行结果可以看出来,不是运行时间上),如改成for N=2 to 4 后仍就是执行了N=2的情况,N=3和N=4的都没有执行。

素数问题的解决是我学习编程永恒的动力。
2019-03-02 12:32
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:57
帖 子:713
专家分:556
注 册:2016-6-29
得分:0 
知道原因了,在选择工作区后,没有把指针移到表头,在进入第一次外循环时,打开的表,指针默认是第一条记录,而当执行第二次外循环时,指针还在表尾,所以条件已经达到,就没有执行,同样其它的外循环都没有执行,不知时间问什么增大了,也可能与数的增大有关,数越大调取的素数表中的记录越多,在这个语句之后SELECT 生成元
加一条go 1的语句,让指针从新回到表头。

素数问题的解决是我学习编程永恒的动力。
2019-03-02 22:29



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




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

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