数学中国

 找回密码
 注册
搜索
热搜: 活动 交友 discuz
楼主: 白新岭

[原创]请教vfbpgyfk先生一个编程问题

  [复制链接]
发表于 2021-10-6 21:37 | 显示全部楼层
循环语句有:
(1)for-endfor、
(2)do  while-enddo、
(3)scan-endscan三种。
如果循环次数明确可以用for-endfor循环。如果循环次数不明确可以用do  while-enddo循环。如果是针对数据表的循环可以用scan-endscan或do while-enddo都可以。
回复 支持 反对

使用道具 举报

发表于 2021-10-6 21:51 | 显示全部楼层
Do While 循环、for 循环、Scan循环
1、DO WHILE  <条件>
      <命令5261序4102列1653>
     [LOOP]
     [EXIT]
     <命令序列>
    ENDDO
2 、FOR  变量=初值TO终值  [STEP 步长]
       <命令序列>
       [LOOP]
       [EXIT]
       <命令序列>
       ENDFOR(或NEXT)
3、SCAN [范围] [FOR条件]
        <命令序列>
        [LOOP]
        [EXIT]
        <命令序列>
     ENDSCAN
第1种根据条件执行循环,条件不满足则退出循环
第2种根据变量初值、终值、增量值决定循环次数
第3种根据指定范围在满足条件时执行循环
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-7 07:53 | 显示全部楼层
CLOSE DATABASES
SELECT 1
USE d:\标记法\素数式至19.DBF ALIAS 素数式19
SELECT 2
USE d:\标记法\素数表参考.DBF ALIAS 素数表参
SELECT 3
USE d:\标记法\三生素数新.DBF ALIAS 三素表
DELETE ALL
PACK

SELECT 三素 数据1 FROM 三素表 WHERE 1=2 INTO CURSOR 数据a READWRITE

kssj = DATETIME()
FOR i=721 TO 722
@12,10 SAY i
    SELECT 式19+(i-1)*9699690 数据1,CAST(1 as INT) 数据mod FROM 素数式19 INTO CURSOR 数据a READWRITE

    SELECT 数据a
    GO BOTTOM     
    sj1=数据1

    SELECT 2
   
    SCAN FOR RECNO()>8 AND 素数*素数<=sj1
        
        UPDATE 数据a SET 数据mod=MOD(数据1,素数表参.素数) WHERE not inlist(数据mod,0,4,6)

        && SELECT 2
    ENDSCAN
   
    INSERT INTO 三素表 (三素) SELECT 数据1 FROM 数据a WHERE not inlist(数据mod,0,4,6)
   
ENDFOR
USE IN 数据a

MESSAGEBOX( DATETIME()-kssj)
用时451秒,判断是否成立,用素数乘法,加了道坎。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-7 07:55 | 显示全部楼层
CLOSE DATABASES
SELECT 1
USE d:\标记法\素数式至19.DBF ALIAS 素数式19
SELECT 2
USE d:\标记法\素数表参考.DBF ALIAS 素数表参
SELECT 3
USE d:\标记法\三生素数新.DBF ALIAS 三素表
DELETE ALL
PACK

SELECT 三素 数据1 FROM 三素表 WHERE 1=2 INTO CURSOR 数据a READWRITE

kssj = DATETIME()
FOR i=721 TO 722
@12,10 SAY i
    SELECT 式19+(i-1)*9699690 数据1,CAST(1 as INT) 数据mod FROM 素数式19 INTO CURSOR 数据a READWRITE

    SELECT 数据a
    GO BOTTOM     
    Kf=INT(SQRT(数据1))

    SELECT 2
   
    SCAN FOR RECNO()>8 AND 素数<=kf
        
        UPDATE 数据a SET 数据mod=MOD(数据1,素数表参.素数) WHERE not inlist(数据mod,0,4,6)

        && SELECT 2
    ENDSCAN
   
    INSERT INTO 三素表 (三素) SELECT 数据1 FROM 数据a WHERE not inlist(数据mod,0,4,6)
   
ENDFOR
USE IN 数据a

MESSAGEBOX( DATETIME()-kssj)
这个运行时间最短:443秒。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-7 07:59 | 显示全部楼层
CLOSE DATABASES
SELECT 1
USE d:\标记法\素数式至19.DBF ALIAS 素数式19
SELECT 2
USE d:\标记法\素数表参考.DBF ALIAS 素数表参
SELECT 3
USE d:\标记法\三生素数新.DBF ALIAS 三素表
DELETE ALL
PACK

SELECT 三素 数据1 FROM 三素表 WHERE 1=2 INTO CURSOR 数据a READWRITE

kssj = DATETIME()
FOR i=721 TO 722
@12,10 SAY i
    SELECT 式19+(i-1)*9699690 数据1,CAST(1 as INT) 数据mod FROM 素数式19 INTO CURSOR 数据a READWRITE

    SELECT 数据a
    GO BOTTOM     
    Kf=INT(SQRT(数据1))

    SELECT 2
   
    SCAN FOR RECNO()>8 AND 素数<=kf
        
        UPDATE 数据a SET 数据mod=MOD(数据1,素数表参.素数) WHERE not inlist(数据mod,0,4,6)

        SELECT 2
    ENDSCAN
   
    INSERT INTO 三素表 (三素) SELECT 数据1 FROM 数据a WHERE not inlist(数据mod,0,4,6)
   
ENDFOR
USE IN 数据a

MESSAGEBOX( DATETIME()-kssj)
这个是在原来的基础上,把不等于的三个条件合并到:not inlist(数据mod,0,4,6),之中,最大的手笔,提速也是惊人,从原来的495秒提到446秒,达到一个新高度。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-7 08:22 | 显示全部楼层
SELECT 1
USE D:\标记法\四生素数生成元.DBF  ALIAS 四生成元
SELECT 2
USE D:\标记法\素数表5万.DBF ALIAS 素数表
kssj=SECONDS()                      &&取出开始时间
    FOR i=1 TO 3187041
     @22,20 SAY i
     n=i
     bpz=19+(n-INT((n-1)/3)*3-1)*90+INT((n-1)/3)*210&&给被判断值置数,以循环值做变量。
        SELECT 素数表
        GO 5                                &&从第二条记录开始读取素数(3)
        FOR j=1 TO 5                     &&内循环开始。这个循环实质上是从小到大顺序,依次读取素数。循环值是记录序号
        qmz=MOD(bpz,素参)                   &&以读取的素数为条件,对被判断值求模
        IF qmz=0 OR qmz=2 OR qmz=6 OR qmz=8 &&如果符合这四个约定条件之一,就进行相应工作.如果一个也没有符合条件的,直接使记录指针向下移动一个(SKIP)
        EXIT                                &&因为符合条件,则做完相应工作后跳出内循环
        ENDIF
        SKIP                                &&素数表指针向下移动一个
        ENDFOR
        IF j>5
        SELECT 1              &&打开保存求解结果的信息表
        APPEND BLANK                        &&增加一条空记录
        REPLACE 四生元 WITH bpz             &&将被判断值保存到被判断值字段中(被判断值数据栏)
        ENDIF
ENDFOR
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
这是产生四生素数生成元程序,到了素数23,自然数跨度223092870.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-7 09:44 | 显示全部楼层
CLOSE DATABASES
SELECT 1
USE d:\标记法\四生素数生成元.DBF ALIAS 生成元23
SELECT 2
USE d:\标记法\素数表参考.DBF ALIAS 素数表参
SELECT 3
USE d:\标记法\四生素数.DBF ALIAS 四素表

SELECT 四素 数据1 FROM 四素表 WHERE 1=2 INTO CURSOR 数据a READWRITE

kssj = DATETIME()
FOR i=1 TO 2
@12,10 SAY i
    SELECT 四生元+(i-1)*223092870 数据1,CAST(1 as INT) 数据mod FROM 生成元23 INTO CURSOR 数据a READWRITE

    SELECT 数据a
    GO BOTTOM     
    Kf=INT(SQRT(数据1))

    SELECT 2
   
    SCAN FOR RECNO()>9 AND 素数<=kf
        
        UPDATE 数据a SET 数据mod=MOD(数据1,素数表参.素数) WHERE not inlist(数据mod,0,2,6,8)

        SELECT 2
    ENDSCAN
   
    INSERT INTO 四素表 (四素) SELECT 数据1 FROM 数据a WHERE not inlist(数据mod,0,2,6,8)
   
ENDFOR
USE IN 数据a

MESSAGEBOX( DATETIME()-kssj)
这是最新制作四生素数表程序,前两周用时576秒。(丢了最开始的12个四生素数)。
回复 支持 反对

使用道具 举报

发表于 2021-10-7 14:34 | 显示全部楼层


BROWSE LAST
COPY TO d:\三生素数中项合成\六生素数统计表60.xls TYPE XL5
MODIFY PROJECT d:\三生素数中项合成\三生中项.pjx
MODIFY COMMAND d:\三生素数中项合成\寻找三生素数中的六生素数并统计.prg AS 936
DO d:\三生素数中项合成\寻找三生素数中的六生素数并统计.prg
SELECT 六生统计
BROWSE LAST
COPY TO d:\三生素数中项合成\六生素数统计表80.xls TYPE XL5
USE

MODIFY COMMAND d:\三生素数中项合成\寻找三生素数中的六生素数并统计.prg AS 936
DO d:\三生素数中项合成\寻找三生素数中的六生素数并统计.prg
SELECT 六生统计
BROWSE LAST
COPY TO d:\三生素数中项合成\六生素数统计表100.xls TYPE XL5
USE
MODIFY COMMAND d:\三生素数中项合成\寻找三生素数中的六生素数并统计.prg AS 936
DO d:\三生素数中项合成\寻找三生素数中的六生素数并统计.prg
MODIFY COMMAND d:\三生素数中项合成\寻找三生素数中的六生素数并统计.prg AS 936
DO d:\三生素数中项合成\寻找三生素数中的六生素数并统计.prg
MODIFY COMMAND d:\三生素数中项合成\寻找三生素数中的六生素数并统计.prg AS 936
DO d:\三生素数中项合成\寻找三生素数中的六生素数并统计.prg
SELECT 六生统计
BROWSE LAST
COPY TO d:\三生素数中项合成\六生素数统计表130.xls TYPE XL5
USE
MODIFY COMMAND d:\三生素数中项合成\寻找三生素数中的六生素数并统计.prg AS 936
DO d:\三生素数中项合成\寻找三生素数中的六生素数并统计.prg
MODIFY COMMAND d:\三生素数中项合成\寻找三生素数中的六生素数并统计.prg AS 936
SELECT 六生统计
BROWSE LAST
COPY TO d:\三生素数中项合成\六生素数统计表150.xls TYPE XL5
USE
MODIFY COMMAND d:\三生素数中项合成\寻找三生素数中的六生素数并统计.prg AS 936
DO d:\三生素数中项合成\寻找三生素数中的六生素数并统计.prg
MODIFY COMMAND d:\三生素数中项合成\寻找三生素数中的六生素数并统计.prg AS 936
DO d:\三生素数中项合成\寻找三生素数中的六生素数并统计.prg
MODIFY COMMAND d:\三生素数中项合成\寻找三生素数中的六生素数并统计.prg AS 936
DO d:\三生素数中项合成\寻找三生素数中的六生素数并统计.prg
SELECT 六生统计
BROWSE LAST
COPY TO d:\三生素数中项合成\六生素数统计表200.xls TYPE XL5
MODIFY PROJECT d:\标记法\标记法项目.pjx
MODIFY COMMAND d:\标记法\删除法制作三生素数去显示记录.prg AS 936
MODIFY COMMAND d:\标记法\删除法制作三生素数去显示记录至19.prg AS 936
USE 三生素数新 AGAIN IN 0
SELECT 三生素数新
BROWSE LAST
?RECCOUNT()
GO bottom
USE
MODIFY COMMAND d:\标记法\删除法制作三生素数去显示记录至19.prg AS 936
DO d:\标记法\删除法制作三生素数去显示记录至19.prg
MODIFY COMMAND d:\标记法\删除法制作三生素数去显示记录至19.prg AS 936
SELECT 三素表
BROWSE LAST
?RECCOUNT()
USE
DO d:\标记法\删除法制作三生素数去显示记录至19进一步.prg
SELECT 三素表
BROWSE LAST
?RECCOUNT()
USE
MODIFY COMMAND d:\标记法\删除法制作三生素数去显示记录至19进一步.prg AS 936
MODIFY PROJECT d:\vfp温习\vfp新素数式.pjx
MODIFY COMMAND d:\vfp温习\从23素数式产生到29素数式分段.prg AS 936
MODIFY COMMAND d:\vfp温习\产生四生成元.prg AS 936
MODIFY PROJECT d:\vfp温习\vfp新素数式.pjx
USE l8四生素数真表 AGAIN IN 0
SELECT L8四生素数真表
BROWSE LAST
COUNT ALL FOR 四素<446185740 TO tj
?tj
GO 14923
GO 1
MODIFY PROJECT d:\vfp温习\vfp新素数式.pjx
USE l8四生素数表 AGAIN IN 0
SELECT L8四生素数表
BROWSE LAST
?RECCOUNT()
GO bottom
USE
USE l8四生素数真表 AGAIN IN 0
SELECT L8四生素数真表
BROWSE LAST
?RECCOUNT()
GO bottom
COUNT ALL FOR 四素<446185740 TO tj
?tj
GO 14923
GO 1
COPY TO d:\vfp温习\四生素数表至2.xls NEXT 14923 TYPE XL5
MODIFY PROJECT d:\标记法\标记法项目.pjx
USE 四生素数 AGAIN IN 0
SELECT 四生素数
BROWSE LAST
GO bottom
USE
MODIFY COMMAND d:\标记法\删除法制作四生素数去显示记录至23进一步.prg AS 936
DO d:\标记法\删除法制作四生素数去显示记录至23进一步.prg
MODIFY COMMAND d:\标记法\删除法制作四生素数去显示记录至23进一步.prg AS 936
DO d:\标记法\删除法制作四生素数去显示记录至23进一步.prg
回复 支持 反对

使用道具 举报

发表于 2021-10-7 21:40 | 显示全部楼层
CLOSE DATABASES
SELECT 1
USE d:\标记法\四生素数生成元.DBF ALIAS 生成元23
SELECT 2
USE d:\标记法\素数表参考.DBF ALIAS 素数表参
SELECT 3
USE d:\标记法\四生素数.DBF ALIAS 四素表

SELECT 四素 数据1 FROM 四素表 WHERE 1=2 INTO CURSOR 数据a READWRITE

kssj = DATETIME()
FOR i=25 TO 28
@12,10 SAY i
    SELECT 四生元+(i-1)*223092870 数据1,CAST(1 as INT) 数据mod FROM 生成元23 INTO CURSOR 数据a READWRITE

    SELECT 数据a
    GO BOTTOM     
    Kf=INT(SQRT(数据1))

    SELECT 2
   
    SCAN FOR RECNO()>9 AND 素数<=kf
        
        UPDATE 数据a SET 数据mod=MOD(数据1,素数表参.素数) WHERE not inlist(数据mod,0,2,6,8)

        SELECT 2
    ENDSCAN
   
    INSERT INTO 四素表 (四素) SELECT 数据1 FROM 数据a WHERE not inlist(数据mod,0,2,6,8)
   
ENDFOR
USE IN 数据a

MESSAGEBOX( DATETIME()-kssj)
最密4生素数可以准备一个千亿大表,比最密三生素数上一个台阶。
回复 支持 反对

使用道具 举报

发表于 2021-10-9 16:22 | 显示全部楼层
CLOSE DATABASES
SELECT 1
USE d:\标记法\四生素数生成元.DBF ALIAS 生成元23
SELECT 2
USE d:\标记法\素数表参考.DBF ALIAS 素数表参
SELECT 3
USE d:\标记法\四生素数.DBF ALIAS 四素表

SELECT 四素 数据1 FROM 四素表 WHERE 1=2 INTO CURSOR 数据a READWRITE

kssj = DATETIME()
FOR i=66 TO 70
@12,10 SAY i
    SELECT 四生元+(i-1)*223092870 数据1,CAST(1 as INT) 数据mod FROM 生成元23 INTO CURSOR 数据a READWRITE

    SELECT 数据a
    GO BOTTOM     
    Kf=INT(SQRT(数据1))

    SELECT 2
   
    SCAN FOR RECNO()>9 AND 素数<=kf
        
        UPDATE 数据a SET 数据mod=MOD(数据1,素数表参.素数) WHERE not inlist(数据mod,0,2,6,8)

        SELECT 2
    ENDSCAN
   
    INSERT INTO 四素表 (四素) SELECT 数据1 FROM 数据a WHERE not inlist(数据mod,0,2,6,8)
   
ENDFOR
USE IN 数据a

MESSAGEBOX( DATETIME()-kssj)
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|数学中国 ( 京ICP备05040119号 )

GMT+8, 2025-7-9 09:14 , Processed in 0.084196 second(s), 14 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表