数学中国

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

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

  [复制链接]
 楼主| 发表于 2021-4-26 20:06 | 显示全部楼层
本帖最后由 白新岭 于 2021-4-26 20:10 编辑

SELECT 1
USE D:\二生素数分解\标记跨度为14的素数式并2次累计.DBF ALIAS 标记素数式及累计2
SELECT 2
USE D:\二生素数分解\累计2的分布值.DBF ALIAS 累计分布
SELECT 3
USE D:\二生素数分解\跨度14的裂解分布统计.DBF ALIAS 裂解分布统计
kssj=SECONDS()
  SELECT 2
  For i=1 to 13  && 这个循环13次,是因为累计2的分布值有13条记录,代表13种素数式的排列(2-5生)
    @ 3,6 say i
     lj=累计
            && jlh1=RECNO()
            SELECT 1
            GO 1
            COUNT ALL FOR lj=累计2 TO tj
              SELECT  3   &&打开盛放素数式的表
              APPEND BLANK     &&增加一条空记录
              REPLACE 跨度 WITH 14
              REPLACE 累计值 WITH lj
              REPLACE 素数 WITH 17
              REPLACE 统计 WITH tj
      SELECT 2
      skip
   ENDFOR
    =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
这个是上个程序的接力,上边检索出来后,这个程序对不同的k生素数式的数量做统计。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-27 19:20 | 显示全部楼层
SELECT 1
USE D:\VFP温习\s3165万内素数.DBF ALIAS 素数表
SELECT 2
USE D:\VFP温习\二生素数14.DBF ALIAS 二生素数表
kssj=SECONDS()
For i=1 to 1953523
      @ 5,12 say i
    SELECT  1     &&打开盛放素数式的表
    jl=recno()
    PUBLIC A
    A=素数
    SKIP 1
    PUBLIC B
    B=素数
    cj=B-A  && 差距
    IF cj=14
         SELECT 2
         APPEND BLANK     &&增加一条空记录
         REPLACE 二素14 WITH A         &&将N值付给素数式
    ENDIF
      SELECT 1
      GO jl+1
   ENDFOR
    =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
这是一个筛选二生相邻素数的程序(本次筛选的是跨度为14的二生相邻素数)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-27 19:34 | 显示全部楼层
SELECT 1
USE D:\vfp温习\二生素数14.DBF ALIAS 二生素数
SELECT 2
USE D:\vfp温习\二生素数的数量统计.DBF ALIAS 二生统计

kssj=SECONDS()
  SELECT 1
  For i=1 to 8 && 这个循环13次,是因为累计2的分布值有13条记录,代表13种素数式的排列(2-5生)
    @ 3,6 say i
     fw=10^i
            && jlh1=RECNO()
            SELECT 1
            GO 1
            COUNT ALL FOR fw>二素14 TO tj
              SELECT  2   &&打开盛放素数式的表
              APPEND BLANK     &&增加一条空记录
              REPLACE 范围 WITH fw
              REPLACE 跨度 WITH 14
              REPLACE 统计 WITH tj
   ENDFOR
    =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
二生相邻素数的统计程序。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-29 17:22 | 显示全部楼层
SELECT 1
USE D:\VFP温习\素数式至19表.DBF ALIAS 素式表
kssj=SECONDS()
    S=1
    SELECT  1     &&打开盛放素数式的表
    APPEND BLANK     &&增加一条空记录
    REPLACE 素数式 WITH S &&将S初始值先付给素数式,即第一条记录值为1
    For i=1 to 3233229
     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 OR MOD(S,19)=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,"运行时间提示")
这是直接产生素数式至19的程序。交替增量。总判断自然数9699690个,除2,有4849845个奇数;除3,1616615,乘2,得3233230个,不能被2,或3整除。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-30 08:50 | 显示全部楼层
CLEAR
SELECT 1
USE D:\vfp温习\素数式至19表.DBF ALIAS 素数式表
SELECT 2
USE D:\vfp温习\素数表万.DBF ALIAS 素数表万
SELECT 3
USE D:\vfp温习\素数表亿.DBF ALIAS 素数表亿

*INPUT "请输入预先值 K= " TO yxk
*INPUT "请输入步长值 bcz= " TO bcz
*INPUT "请输入初始值 csz= " TO csz
*INPUT "请输入外循环起始值 xks= " TO xks
*INPUT "请输入外循环终结值 zds= " TO zds
bcz=9699690  &&从2乘到19,即素数19的素数阶乘
kssj=SECONDS()                      &&取出开始时间
FOR i=1 TO 1
@12,10 SAY i
FOR j=1 TO 1658880
SELECT 1
sss=素数式
bpz=sss+(i-1)*bcz               &&计算被判断值
Kf=INT(SQRT(bpz))                   &&求出被判断值的开方根
SELECT 2                     &&打开素数表
LOCATE FOR 素数>=kf                 &&根据开方根,查找最大素数
DO CASE
CASE EOF()                          &&如果超出素数表最后一条记录
GO BOTTOM
CASE 素数>kf                        &&如果找到的素数比开方根值大,就将记录指针退回一个,保证使用的最大素数在开方根内
SKIP -1
ENDCASE
jlh=RECNO()                         &&记录下最大素数(开方根内)记录位置(如果找到的素数等于开方根,则直接读取这个素数的位置)
GO 8                                &&从第二条记录开始读取素数(3)
FOR j=1 TO jlh-7                     &&内循环开始。这个循环实质上是从小到大顺序,依次读取素数。循环值是记录序号
qmz=MOD(bpz,素数)                   &&以读取的素数为条件,对被判断值求模
IF qmz=0 && OR qmz=2 OR qmz=6 OR qmz=8  如果符合这四个约定条件之一,就进行相应工作.如果一个也没有符合条件的,直接使记录指针向下移动一个(SKIP)
EXIT                                &&因为符合条件,则做完相应工作后跳出内循环
ENDIF
SKIP                                &&素数表指针向下移动一个
ENDFOR
IF j>jlh-7
SELECT 3               &&打开保存求解结果的信息表
APPEND BLANK                        &&增加一条空记录
REPLACE 素数 WITH bpz && 把bpz赋给素数        
ENDIF
SELECT 1
SKIP
ENDFOR
ENDFOR
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
这是个制作素数的程序,不知什么原因,居然运算一宿,也没有算完一个周期内的素数。(9699690内的素数)
电脑配置?算法?.....?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-30 11:19 | 显示全部楼层
白新岭 发表于 2021-4-30 08:50
CLEAR
SELECT 1
USE D:\vfp温习\素数式至19表.DBF ALIAS 素数式表

上边的程序,有一处错误,用了同一个变量j(在两个FOR   to  语句中),我说程序老是提示已经到表尾了。无论增加表1的记录条,还是当一次内循环结束以后,返回表1的起始位置,都没有解决此问题,后来才看到,两个for  to  语句,竟然用了同一个变量j(造成程序错误,以前也出现过类似情况)。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-30 12:45 | 显示全部楼层
CLEAR
SELECT 1
USE D:\vfp温习\素数式至17表.DBF ALIAS 素数式表
SELECT 2
USE D:\vfp温习\素数表万.DBF ALIAS 素数表万
SELECT 3
USE D:\vfp温习\素数表亿新.DBF ALIAS 素数表亿新
*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=31 TO 100
@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,"运行时间提示")
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-4-30 18:01 | 显示全部楼层
上楼用了统计函数count代替了原来的分枝语句case
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-1 11:24 | 显示全部楼层
SELECT 1
USE D:\二生素数分解\素数式11.DBF ALIAS 素数式11
SELECT 2
USE D:\二生素数分解\标记跨度为14的素数式并2次累计.DBF ALIAS 标记素数式及累计2次
kssj=SECONDS()
    For i=1 to 480
    @ 3,6 say i
     SELECT 1
     ss11=素式11
     jlh1=RECNO()
        FOR j=1 TO 7
        ss11b=素式11
        jlh2=RECNO()  && 记录指针位置
              IF ss11b-ss11=16
                 SELECT 1
                 GO jlh1
                 ss11l=素式11 && ss11l是素式11累计的缩写
                 s=0
                 m=0
                 FOR k=1 TO j
                 ss11lb=素式11
                 jlh3=RECNO()  
                 zl=ss11lb-ss11l
                 s=s+zl
                 m=m+s
                  SELECT 1
                  GO jlh3+1
                  endfor
              SELECT  2   &&打开盛放素数式的表
              APPEND BLANK     &&增加一条空记录
              REPLACE 记录号 with jlh1  &&将B值付给素数式
              REPLACE 跨度 WITH 16
              REPLACE 素数 WITH 11
              REPLACE 素式量 WITH j
              REPLACE 累计2 WITH m
              ENDIF
        SELECT 1
        GO jlh2+1
        ENDFOR
      SELECT 1
      GO jlh1+1
   endfor
    =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
这是在至素数11中筛选,跨度为16的素数式分布情况的程序(进行实际考察)。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-5-1 11:35 | 显示全部楼层
SELECT 1
USE D:\二生素数分解\素数式13.DBF ALIAS 素数式13
SELECT 2
USE D:\二生素数分解\标记跨度为14的素数式并2次累计.DBF ALIAS 标记素数式及累计2次
kssj=SECONDS()
    For i=1 to 5760
    @ 3,6 say i
     SELECT 1
     ss13=素式13
     jlh1=RECNO()
        FOR j=1 TO 7
        ss13b=素式13
        jlh2=RECNO()  && 记录指针位置
              IF ss13b-ss13=16
                 SELECT 1
                 GO jlh1
                 ss13l=素式13 && ss11l是素式11累计的缩写
                 s=0
                 m=0
                 FOR k=1 TO j
                 ss13lb=素式13
                 jlh3=RECNO()  
                 zl=ss13lb-ss13l
                 s=s+zl
                 m=m+s
                  SELECT 1
                  GO jlh3+1
                  endfor
              SELECT  2   &&打开盛放素数式的表
              APPEND BLANK     &&增加一条空记录
              REPLACE 记录号 with jlh1  &&将B值付给素数式
              REPLACE 跨度 WITH 16
              REPLACE 素数 WITH 13
              REPLACE 素式量 WITH j
              REPLACE 累计2 WITH m
              ENDIF
        SELECT 1
        GO jlh2+1
        ENDFOR
      SELECT 1
      GO jlh1+1
   endfor
    =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-15 20:47 , Processed in 0.117478 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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