数学中国

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

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

  [复制链接]
 楼主| 发表于 2019-6-6 07:28 | 显示全部楼层
USE  e:\用vfp求k生素数数量\素数生成元23.dbf
DO WHILE NOT EOF()
        SELECT 素数生成元23
        PUBLIC B
        B=素数式23
SKIP    &&隐含了每产生一个邻距23,就下一一个记录
PUBLIC A
A=素数式23
C=A-B
REPLACE 邻距23 WITH C
ENDDO
填写间距23
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-6 07:30 | 显示全部楼层
CLEAR ALL
SELECT 1
USE E:\用vfp求k生素数数量\升序代数数19.DBF ALIAS 升序代数数19
SELECT 2
USE E:\用vfp求k生素数数量\统计升19中差距16的重复次数.dbf ALIAS 统计升19中差距16的重复次数
SELECT 统计升19中差距16的重复次数
go top
DO WHILE not eof()
    PUBLIC A
     A=差距16的值
     SELECT 1
     PUBLIC B
     COUNT for 间隔16=A to B
     SELECT 统计升19中差距16的重复次数
     REPLACE 重复次数 WITH  B
     skip
enddo
CLEAR ALL                               
统计素数式19中16的重复次数
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-6 07:31 | 显示全部楼层
*ALL表示所有记录
*NEXT(n)从当前记录起的N个记录
*RECORD(N)第N个记录
*REST从当前记录起到最后一条记录
CLEAR ALL
SELECT 1
USE E:\用vfp求k生素数数量\查询13中的3家村.dbf ALIAS 查询13中的3家村
SELECT 2
USE  e:\用vfp求k生素数数量\k家村的间距.dbf ALIAS k家村的间距
DO WHILE NOT EOF()
        PUBLIC A
        A=代数13
        PUBLIC B
        B=recno()
        PUBLIC D
        COUNT NEXT 5 FOR 间距13=2 TO D
        IF D=3
           SELECT 查询13中的3家村
           APPEND BLANK
           REPLACE 在13中3 WITH A
           REPLACE 在13中的位置 WITH B
           SELECT k家村的间距
        endif
    go B
    SKIP
ENDDO
CLEAR ALL
寻找点序列
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-7 15:42 | 显示全部楼层
SELECT 1
USE F:\k生素数\素数式至23.dbf ALIAS 素数23
SELECT 2
USE F:\k生素数\最密k生素数的间距.dbf ALIAS 最密k间距
kssj=SECONDS()                      &&取出开始时间
FOR I=10 TO 12
@ 5,12 say I
SELECT 1
go top
   FOR J=1 TO 36495360-I+1
      PUBLIC A
      A=素数式23
      JL1=RECNO()
      skip I-1
      PUBLIC B
      B=素数式23
      GO JL1+1
      PUBLIC C
      C=素数式23
      skip I-1
      PUBLIC D
      D=素数式23
      GO I+2
      PUBLIC E
      E=素数式23
      SKIP I-1
      PUBLIC F
      F=素数式23
      H=B-A
      G=D-C
      K=F-E
      IF G>H
        L=H
        ELSE
        L=G
      ENDIF
      IF K>L
         L=L
         ELSE
         L=K
      ENDIF
      GO J+1
      ENDFOR
        IF J>36495360-I+1
          SELECT 2
          APPEND BLANK
          REPLACE k值 WITH I
          REPLACE 最短间距 WITH L
        ENDIF
ENDFOR
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
这个程序不对,运算结果当k=10,11,12时,运算结果是负2.23亿多得数,是倒数的几个值,这说明后续的值为0,已经超出记录范围。
另外最主要的是,程序开始的A,B,C,D和G,H应在内循环以外,只调入一个结果L值就可以了,然后逐个与新值比较完成内循环。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-7 16:45 | 显示全部楼层
5分31.86秒(运行k=10,11,12,素数式23).
SELECT 1
USE F:\k生素数\素数式至23.dbf ALIAS 素数23
SELECT 2
USE F:\k生素数\最密k生素数的间距.dbf ALIAS 最密k间距
kssj=SECONDS()                      &&取出开始时间
FOR I=10 TO 12
@ 5,12 say I
SELECT 1
      go top
      PUBLIC A
      A=素数式23
      skip I-1
      PUBLIC B
      B=素数式23
      GO 2
      PUBLIC C
      C=素数式23
      skip I-1
      PUBLIC D
      D=素数式23
      H=B-A
      G=D-C
      IF G>H
        L=H
        ELSE
        L=G
      ENDIF
         GO 3
         FOR J=1 TO 36495360-I-1
         PUBLIC E
         E=素数式23
         SKIP I-1
         PUBLIC F
         F=素数式23
         K=F-E
              IF K>L
              L=L
              ELSE
              L=K
              ENDIF
              SKIP -I+2
        ENDFOR
        IF J>36495360-I-1
          SELECT 2
          APPEND BLANK
          REPLACE k值 WITH I
          REPLACE 最短间距 WITH L
        ENDIF
ENDFOR
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
这次的运行结果正确。用时也比较短。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-7 18:45 | 显示全部楼层
计算了30个k值用时65分21.57秒。
运算1072万到1162万90万个区段用时25小时42分36.20秒。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-8 11:59 | 显示全部楼层
从k=43到k=100,运算52个k值,用时37分50.14秒。平均用时39.14秒,跨度36495360个数据的比较。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-9 14:59 | 显示全部楼层
用时239分12.67秒,运算10万外循环数据。从1662万到1672万。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-10 20:20 | 显示全部楼层
用时91分37.93秒。
当注销显示外循环时,用时1分17.55秒,简直神了。
SELECT 1
USE F:\k生素数\素数式至23.dbf ALIAS 素数23
SELECT 2
USE F:\k生素数\k100生素数.dbf ALIAS k100素数
kssj=SECONDS() &&取出开始时间
FOR J=1 TO 36495360-99
&& @ 5,12 say J
  SELECT 1
      PUBLIC A
      A=素数式23
      C=RECNO()
      skip 99
       PUBLIC B
      B=素数式23
        IF B-A=542
          SELECT 2
          APPEND BLANK
          REPLACE k100jl WITH C
        ENDIF
        SELECT 1
        go C+1
ENDFOR
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
程序一样,一个在主窗口显示外循环,一个不显示。但是用时相差悬殊。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-11 10:01 | 显示全部楼层
SELECT 1
USE F:\k生素数\素数式至23.dbf ALIAS 素数23
SELECT 2
USE F:\k生素数\k100生素数.dbf ALIAS k100素数
kssj=SECONDS() &&取出开始时间
FOR J=1 TO 36495360-99
&& @ 5,12 say J
  SELECT 1
      PUBLIC A
      A=素数式23
      C=RECNO()
      skip 99
       PUBLIC B
      B=素数式23
        IF B-A=542
          SELECT 2
          APPEND BLANK
          REPLACE k100jl WITH C
        ENDIF
        SELECT 1
        go C+1
ENDFOR
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
标记k生素数式的起始位置。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-17 00:13 , Processed in 0.078125 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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