数学中国

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

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

  [复制链接]
 楼主| 发表于 2020-10-4 06:58 | 显示全部楼层
SELECT 1
USE D:\VFP温习\素数式至17表.DBF ALIAS 素式表
kssj=SECONDS()
    S=1
    For i=1 to 170169
     PUBLIC N
      N=i
      @ 5,12 say N
       IF MOD(N,2)=0 &&判断循环值是否被2整除
       S=S+2  &&符合条件执行的方案
       ELSE
       S=S+4 &&不符合条件执行的方案
       ENDIF
       IF MOD(S,5)=0 OR  MOD(S,7)=0 OR MOD(S,11)=0 OR  MOD(S,13)=0 OR MOD(S,17)=0&& 如果S被其中素数之一整除就跳过,什么也不做
       ELSE  &&否则执行第二步方案
       SELECT  1     &&打开盛放素数式的表
       APPEND BLANK     &&增加一条空记录
       REPLACE 素数式 WITH S          &&将N值付给素数式
       endif
    endfor
    =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
与上楼相仿,是直接从素数式至3到素数式至17的程序,运行结果正确,需要把1插入到第一条记录之前。
运行时间0分33.51秒,比起用excel要快而省事。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-4 06:59 | 显示全部楼层
后边至19,23,29的不在贴出。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-4 07:53 | 显示全部楼层
从素数式3直接产生至素数式19用时10分34.11秒(窗口显示打开,如果关闭,会节约时间,另外显示循环值,也会使时间延长,可以把显示为万级别)。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-4 08:38 | 显示全部楼层
今天遇见一种怪事,在vfp中表的记录条内容显示错误,我以10进位的记录浏览比对,当到18时出现比值与开始的不一致,后来往会返,结果出现了0开头数字,这时才感觉到可能是记录内容显示不完整,但是无法相excel那样拖动单元格的宽度,只好到工具菜单栏中找到选项,把以前去掉的对勾从新打上,这次可以拖动单元格宽度了,内容显示完整,是自己所要结果。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-4 09:54 | 显示全部楼层
运行时间42分9.42秒(按前边至19的运行时间10分34.11秒计算,最少是10.5*23=240多分,即4个小时以上,这就是窗口显示与不显示的差距),虽然循环值显示,那占用时间有限。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-4 16:32 | 显示全部楼层
今天(20201004日下午16.18分前)运行摘抄符合条件的素数式段落(即在素数式至23中摘抄前后跨度为838,素数式个数是151个,包括起始两个在内)运行时间19分36.34秒,总循环次数36495209,获得两组,而且这两组是中间二组,太巧合了,我可以扩展到素数37了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-4 16:45 | 显示全部楼层
SELECT 1
USE D:\VFP温习\素数式至23表.DBF ALIAS 素式表
kssj=SECONDS()
    SELECT  1     &&打开盛放素数式的表
    A=素数式
    SKIP 150
    B=素数式
    zx=B-A
    GO 2
    For i=1 to 36495208
      @ 5,12 say i
      jl=recno()
      PUBLIC D
      D=素数式
      SKIP 150
      PUBLIC E
      E=素数式
      F=E-D
      zx=MIN(F,zx)
      GO jl+1
    ENDFOR
    ?zx
    =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
这是寻找151个素数式分布最短距离的程序,运行结果是最密素数式为838,(覆盖151个素数式)。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-4 16:50 | 显示全部楼层
SELECT 1
USE D:\VFP温习\素数式至23表.DBF ALIAS 素式表
SELECT 2
USE D:\VFP温习\素数式至23最密151生表.DBF ALIAS 素式段表
kssj=SECONDS()
For i=1 to 36495209
      @ 5,12 say i
    SELECT  1     &&打开盛放素数式的表
    jl=recno()
    PUBLIC A
    A=素数式
    SKIP 150
    PUBLIC B
    B=素数式
    cj=B-A
    IF cj=838
        SELECT 1
        GO jl
        FOR j=1 TO 151
        SELECT 1
        PUBLIC C
        C=素数式
         SELECT 2
         APPEND BLANK     &&增加一条空记录
         REPLACE 素数式 WITH C          &&将N值付给素数式
         SELECT 1
         SKIP
       endfor
    ENDIF
      SELECT 1
      GO jl+1
   ENDFOR
    =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
这是在上一个程序的基础上摘抄最密素数式151个(跨度838,经历839个自然数),只有两组,而且恰好挨着,因为间隔为10.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-4 18:22 | 显示全部楼层
SELECT 1
USE D:\VFP温习\素数式至29段表.DBF ALIAS 素式29段表
SELECT 2
USE D:\VFP温习\素数式至31段表.DBF ALIAS 素式31段表
kssj=SECONDS()
    For i=1 to 31
      N=i
      @ 5,12 say N
      SELECT 1
      GO 1
      FOR j=1 TO 8456
      SELECT 1
      A=素数式
      B=A+(i-1)*6469693230
       IF MOD(B,31)=0 && 如果S被其中素数之一整除就跳过,什么也不做
       ELSE  &&否则执行第二步方案
       SELECT  2     &&打开盛放素数式的表
       APPEND BLANK     &&增加一条空记录
       REPLACE 素数式 WITH B &&将B值付给素数式
       ENDIF
       SELECT 1
       skip
      ENDFOR
   endfor
    =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
这是素数式段落升级程序(把最密素数式部分段落,扩大范围,已经不是全体素数式了)。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-6 12:41 | 显示全部楼层
SELECT 1
USE D:\VFP温习\素数式至23表.DBF ALIAS 素式表
SELECT 2
USE D:\VFP温习\素数23平表.DBF ALIAS 素数表
SELECT 3
USE D:\VFP温习\素数523平段表.DBF ALIAS 新素数表
kssj=SECONDS()
SELECT 1  
GO 92
FOR j=1 TO 44657
@ 5,12 say j
    SELECT 1  &&打开盛放素数式的表
     PUBLIC A
     A=素数式
     SELECT 2
     GO 9
     FOR i=1 TO 90
     SELECT 2
     jl=recno()-8
     @ 7,14 say jl
      PUBLIC B
       B=素数
       IF MOD(A,B)=0
       EXIT
        SELECT 2
        SKIP
       ENDIF
     ENDFOR
     IF jl>89
     SELECT 3
     APPEND BLANK     &&增加一条空记录
      REPLACE 素数 WITH A &&将S初始值先付给素数式,即第一条记录值为1
     ENDIF
      SELECT 1
      SKIP
    endfor
    =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
这个程序不能完成任何任务(运行结果,表3是空的,无数据),后来我把记录(jl)显示出来,感情是jl的值一直是1,就没有增加的可能性。不知什么情况,无奈下,把循环值直接赋予指针。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-16 08:37 , Processed in 0.096680 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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