数学中国

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

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

  [复制链接]
 楼主| 发表于 2016-8-8 22:05 | 显示全部楼层
10生从19到23程序(VFP8)
use E:\用vfp求k生素数数量\k10生成初始值23.dbf ALIAS k10生成初始值23  &&注意,表开头不允许以数字开头,每次增倍一个素数周期,就把表名结尾的数字改成相符的数(指与新素数相同)
SELECT 2
USE E:\用vfp求k生素数数量\k10生成初始值19.DBF ALIAS k10生成初始值19 &&注意,表开头不允许以数字开头,每次增倍一个素数周期,就把表名结尾的数字改成相符的数(指与新素数相同)
*INPUT "请输入外循环开始值 wxhks=" TO wxhks
*INPUT "请输入外循环结束值 wjs=" TO wjs
*INPUT "请输入内循环开始值 nks=" TO nks
*INPUT "请输入内循环结束值 njs=" TO njs
GO Top
FOR h=1 TO 630  &&注意,当复制此程序模版时一定把外循环次数改成工作区2打开表的总记录条数的值
        SELECT k10生成初始值19
        FOR j=0 TO 22        &&改成这个大素数-1的值,从打开的表名后边的两个素数中,选中最大的一个素数-1,把此值付给内循环的终值
        bpz=初始值19+j*9699690       &&注意这条语句中的生成元?字段名末尾的数字,它是两个素数较小的一个
                qmz=MOD(bpz,23)       &&注意取模素数,它是较大的一个素数
                IF qmz=0 OR qmz=2 OR qmz=6 OR qmz=8 OR qmz=12 OR qmz=18 OR qmz=20 OR qmz=3 OR qmz=7 OR qmz=9 &&这里的预先给的限制余数是对qmz中的素数取模的余数,如果大于上边的素数,也需把余数改为同余的余数
                ELSE
                        SELECT  k10生成初始值23
                        APPEND BLANK
                        REPLACE 初始值23 WITH bpz
                        SELECT k10生成初始值19
                ENDIF
        ENDFOR
        SKIP
ENDFOR
CLEAR ALL
 楼主| 发表于 2016-8-8 22:17 | 显示全部楼层
这是填写间距23(如果想从填一个表,可以增加一个表名,这是间隔1,如果间隔多可以在skip填上移动的步数)
USE  e:\用vfp求k生素数数量\升序代数数23.dbf
DO WHILE NOT EOF()
        SELECT 升序代数数23
        PUBLIC B
        B=代数23
SKIP
PUBLIC A
A=代数23
C=A-B
REPLACE 间距23 WITH C
ENDDO
 楼主| 发表于 2016-8-8 22:32 | 显示全部楼层
4生数11到13
* 请注意,外循环是初始值,即:从1到3,
CLEAR ALL
SELECT 1
USE E:\用vfp求k生素数数量\生成初始值13.dbf ALIAS 生成初始值13
SELECT 2
USE E:\用vfp求k生素数数量\生成初始值11.DBF ALIAS 生成初始值11
*INPUT "请输入外循环开始值 wxhks=" TO wxhks
*INPUT "请输入外循环结束值 wjs=" TO wjs
*INPUT "请输入内循环开始值 nks=" TO nks
*INPUT "请输入内循环结束值 njs=" TO njs
GO Top
FOR h=1 TO 21
        SELECT 生成初始值11
        FOR j=0 TO 12
                bpz=生成元11+j*2310       &&注意这条语句中的“初始值”
                qmz=MOD(bpz,13)
                IF qmz=0 OR qmz=2 OR qmz=6 OR qmz=8
                ELSE
                        SELECT  生成初始值13
                        APPEND BLANK
                        REPLACE 生成元13 WITH bpz
                        SELECT 生成初始值11
                ENDIF
        ENDFOR
        SKIP
ENDFOR
CLEAR ALL                               
 楼主| 发表于 2016-8-8 22:35 | 显示全部楼层

k5家村初始值19到23
CLEAR ALL
SELECT 1
USE E:\用vfp求k生素数数量\k5家村初始值23.dbf ALIAS k5家村初始值23 &&当每增倍一个素数周期就改成下一个表名(改成带下一个素数数字的表
SELECT 2
USE E:\用vfp求k生素数数量\k5家村初始值19.DBF ALIAS k5家村初始值19 &&同上
GO Top
FOR h=1 TO 640  &&外循环终值改成下边选择的工作区表中的记录总数
        SELECT k5家村初始值19 &&同第一条注释
        FOR j=0 TO 22  &&改成下一个素数-1,共计下一个素数值的次数
                bpz=初始值19+j*9699690      &&注意这条语句中的“初始值”---改成字段名
                qmz=MOD(bpz,23)  &&用新增加的素数值
         IF qmz=0 OR qmz=2 OR qmz=6 OR qmz=8 OR qmz=18 OR qmz=20 OR qmz=7 OR qmz=9 OR qmz=13 OR qmz=15
                   ELSE
                        SELECT  k5家村初始值23 &&同第一条注释
                        APPEND BLANK
                        REPLACE 初始值23 WITH bpz &&改成本次追加记录的字段名
                        SELECT k5家村初始值19 &&同第一条注释
                ENDIF
        ENDFOR
        SKIP
ENDFOR
CLEAR ALL                               
 楼主| 发表于 2016-8-8 22:40 | 显示全部楼层
nbj5生数直筛选
CLEAR ALL
SELECT 1
USE E:\用vfp求k生素数数量\最密5生素数群.DBF ALIAS 最密5生素数
SELECT 2
USE E:\用vfp求k生素数数量\素数表2.DBF ALIAS 素数表
SELECT 3
USE E:\用vfp求k生素数数量\k5生成初始值23.DBF ALIAS 生成初始值23
*INPUT "请输入预先值 K= " TO yxk
*INPUT "请输入步长值 bcz= " TO bcz
*INPUT "请输入初始值 csz= " TO csz
*INPUT "请输入外循环起始值 xks= " TO xks
*INPUT "请输入外循环终结值 zds= " TO zds
GO top                                    &&***************这条语句是将“k8生成初始值31”表的指针移到“41001”处**************
DO WHILE NOT EOF()                          &&*********既然是调用表中信息,而且是后部分,就应该使用“DO WHILE NOT EOF()”语句,由它来判断是否到文件尾**********
        @ 2,5 say RECNO()                       &&显示记录号
        bpz=生成元23                            &&计算被判断值
        Kf=INT(SQRT(bpz))                       &&求出被判断值的开方根
        SELECT 素数表                         &&打开素数表
        LOCATE FOR 素数>=kf                     &&根据开方根,查找最大素数
        DO CASE
                CASE EOF()                          &&如果超出素数表最后一条记录
                        GO BOTTOM
                CASE 素数>kf                        &&如果找到的素数比开方根值大,就将记录指针退回一个,保证使用的最大素数在开方根内
                        SKIP -1
        ENDCASE
        SSS=RECNO()                             &&记录下最大素数(开方根内)记录位置(如果找到的素数等于开方根,则直接读取这个素数的位置)
        GO 9                                   &&从第二条记录开始读取素数(37)
        FOR j=9 TO SSS                         &&内循环开始。这个循环实质上是从小到大顺序,依次读取素数。循环值是记录序号
                qmz=MOD(bpz,素数)                   &&以读取的素数为条件,对被判断值求模 【qmz=MOD(bpz,素数)】文本号括着的原在此行语句体部分.特别需要注意的是在用标点符号时,一定改成英文模式及半角状态。
                IF qmz=0 OR qmz=2 OR qmz=6 OR qmz=8 OR qmz=12
                        EXIT         
                ENDIF
                SKIP                                &&素数表指针向下移动一个
        ENDFOR
        IF j>sss
                SELECT  最密5生素数                 &&打开保存求解结果的信息表
                APPEND BLANK                        &&增加一条空记录
        REPLACE 被判值 WITH bpz             &&将被判断值保存到被判断值字段中(被判断值数据栏)
                REPLACE 开方根 WITH kf              &&将开方根保存到开方根字段中(开方根值数据栏)
                REPLACE 外环值 WITH RECNO()
        ENDIF
        SELECT 生成初始值23
        SKIP
ENDDO
CLEAR ALL
 楼主| 发表于 2016-8-8 22:43 | 显示全部楼层

nbj二维5生数程序
CLEAR ALL
SELECT 1
USE E:\用vfp求k生素数数量\最密5生素数群.DBF ALIAS 最密5生素数
SELECT 2
USE E:\用vfp求k生素数数量\素数表2.DBF ALIAS 素数表
SELECT 3
USE E:\用vfp求k生素数数量\k5生成初始值23.DBF ALIAS 生成初始值23
*INPUT "请输入预先值 K= " TO yxk
*INPUT "请输入步长值 bcz= " TO bcz
*INPUT "请输入初始值 csz= " TO csz
*INPUT "请输入外循环起始值 xks= " TO xks
*INPUT "请输入外循环终结值 zds= " TO zds
GO top                                    &&***************这条语句是将“k8生成初始值31”表的指针移到“41001”处**************
DO WHILE NOT EOF()                          &&*********既然是调用表中信息,而且是后部分,就应该使用“DO WHILE NOT EOF()”语句,由它来判断是否到文件尾**********
        @ 2,5 say RECNO()                       &&显示记录号
        scy=生成元23                            &&计算被判断值
        For i=7 to 12
        bpz=scy+i*223092870
        Kf=INT(SQRT(bpz))                       &&求出被判断值的开方根
        SELECT 素数表                         &&打开素数表
        LOCATE FOR 素数>=kf                     &&根据开方根,查找最大素数
        DO CASE
                CASE EOF()                          &&如果超出素数表最后一条记录
                        GO BOTTOM
                CASE 素数>kf                        &&如果找到的素数比开方根值大,就将记录指针退回一个,保证使用的最大素数在开方根内
                        SKIP -1
        ENDCASE
        SSS=RECNO()                             &&记录下最大素数(开方根内)记录位置(如果找到的素数等于开方根,则直接读取这个素数的位置)
        GO 9                                   &&从第二条记录开始读取素数(37)
        FOR j=9 TO SSS                         &&内循环开始。这个循环实质上是从小到大顺序,依次读取素数。循环值是记录序号
                qmz=MOD(bpz,素数)                   &&以读取的素数为条件,对被判断值求模 【qmz=MOD(bpz,素数)】文本号括着的原在此行语句体部分.特别需要注意的是在用标点符号时,一定改成英文模式及半角状态。
                IF qmz=0 OR qmz=2 OR qmz=6 OR qmz=8 OR qmz=12
                        EXIT         
                ENDIF
                SKIP                                &&素数表指针向下移动一个
        ENDFOR
        IF j>sss
                SELECT  最密5生素数                 &&打开保存求解结果的信息表
                APPEND BLANK                        &&增加一条空记录
        REPLACE 被判值 WITH bpz             &&将被判断值保存到被判断值字段中(被判断值数据栏)
                REPLACE 开方根 WITH kf              &&将开方根保存到开方根字段中(开方根值数据栏)
                REPLACE 外环值 WITH RECNO()+1
        ENDIF
        ENDFOR
        SELECT 生成初始值23
        SKIP
ENDDO
CLEAR ALL
 楼主| 发表于 2016-8-8 22:46 | 显示全部楼层
测升序代数数17的13间距

USE  e:\用vfp求k生素数数量\升序代数数17.dbf
DO WHILE NOT EOF()
        SELECT 升序代数数17
        PUBLIC B
        B=代数17
    PUBLIC D
    D=recno()
    SKIP 24
    PUBLIC A
    A=代数17
    C=A-B
    REPLACE 间隔13 WITH C
    go D
    skip
ENDDO
 楼主| 发表于 2016-8-8 22:48 | 显示全部楼层
查询23中的8家村

*ALL表示所有记录
*NEXT(n)从当前记录起的N个记录
*RECORD(N)第N个记录
*REST从当前记录起到最后一条记录
CLEAR ALL
SELECT 1
USE E:\用vfp求k生素数数量\查询23中的8家村.dbf ALIAS 查询23中的8家村
SELECT 2
USE  e:\用vfp求k生素数数量\升序代数数23.dbf ALIAS 升序代数数23
DO WHILE NOT EOF()
        PUBLIC A
        A=代数23
        PUBLIC B
        B=recno()
        PUBLIC D
        COUNT NEXT 15 FOR 间距23=2 TO D
        IF D=8
           SELECT 查询23中的8家村
           APPEND BLANK
           REPLACE 在23中8 WITH A
           REPLACE 在23中的位置 WITH B
           SELECT 升序代数数23
        endif
    go B
    SKIP
ENDDO
CLEAR ALL
 楼主| 发表于 2016-8-8 22:50 | 显示全部楼层
产生最密5家村

CLEAR ALL
SELECT 1
USE E:\用vfp求k生素数数量\最密5家村.dbf ALIAS 最密5家村 &&当每增倍一个素数周期就改成下一个表名(改成带下一个素数数字的表
SELECT 2
USE E:\用vfp求k生素数数量\素数表2.dbf ALIAS 素数表2
SELECT 3
USE E:\用vfp求k生素数数量\k5家村初始值29.DBF ALIAS k5家村初始值29 &&同上
GO top                                    &&***************这条语句是将“k8生成初始值31”表的指针移到“41001”处**************
DO WHILE NOT EOF()                          &&*********既然是调用表中信息,而且是后部分,就应该使用“DO WHILE NOT EOF()”语句,由它来判断是否到文件尾**********
        @ 2,5 say RECNO()                       &&显示记录号
        scy=初始值29                           &&计算被判断值
        For i=33 to 48
        bpz=scy+i*6469693230
        Kf=INT(SQRT(bpz))                       &&求出被判断值的开方根
        SELECT 素数表2                        &&打开素数表
        LOCATE FOR 素数>=kf                     &&根据开方根,查找最大素数
        DO CASE
                CASE EOF()                          &&如果超出素数表最后一条记录
                        GO BOTTOM
                CASE 素数>kf                        &&如果找到的素数比开方根值大,就将记录指针退回一个,保证使用的最大素数在开方根内
                        SKIP -1
        ENDCASE
        SSS=RECNO()                             &&记录下最大素数(开方根内)记录位置(如果找到的素数等于开方根,则直接读取这个素数的位置)
        GO 12                                   &&从第二条记录开始读取素数(37)
        FOR j=12 TO SSS                         &&内循环开始。这个循环实质上是从小到大顺序,依次读取素数。循环值是记录序号
                qmz=MOD(bpz,素数)                   &&以读取的素数为条件,对被判断值求模 【qmz=MOD(bpz,素数)】文本号括着的原在此行语句体部分.特别需要注意的是在用标点符号时,一定改成英文模式及半角状态。
                IF qmz=0 OR qmz=2 OR qmz=6 OR qmz=8 OR qmz=18 OR qmz=20 OR qmz=30 OR qmz=32 OR qmz=36 OR qmz=38
                        EXIT         
                ENDIF
                SKIP                                &&素数表指针向下移动一个
        ENDFOR
          IF j>sss
                SELECT  最密5家村                 &&打开保存求解结果的信息表
                APPEND BLANK                        &&增加一条空记录
        REPLACE 被判值 WITH bpz             &&将被判断值保存到被判断值字段中(被判断值数据栏)                                
          ENDIF
        ENDFOR
        SELECT k5家村初始值29
        SKIP
ENDDO
CLEAR ALL
 楼主| 发表于 2016-8-8 22:54 | 显示全部楼层

从13代数数到17
* 请注意,外循环是初始值,即:从1到3,
CLEAR ALL
SELECT 1
USE E:\用vfp求k生素数数量\代数数17.dbf ALIAS 代数数17
SELECT 2
USE E:\用vfp求k生素数数量\代数数13.DBF ALIAS 代数数13
*INPUT "请输入外循环开始值 wxhks=" TO wxhks
*INPUT "请输入外循环结束值 wjs=" TO wjs
*INPUT "请输入内循环开始值 nks=" TO nks
*INPUT "请输入内循环结束值 njs=" TO njs
GO Top
FOR h=1 TO 5760
        SELECT 代数数13
        FOR j=0 TO 16
                bpz=代数13+j*30030      &&注意这条语句中的“初始值”
                qmz=MOD(bpz,17)
                IF qmz=0
                ELSE
                        SELECT  代数数17
                        APPEND BLANK
                        REPLACE 代数17 WITH bpz
                        SELECT 代数数13
                ENDIF
        ENDFOR
        SKIP
ENDFOR
CLEAR ALL                               
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-9-29 09:26 , Processed in 0.093750 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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