数学中国

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

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

  [复制链接]
发表于 2021-7-14 17:36 | 显示全部楼层
Local xjl,djl,ts,xss,dss,kssj,tj
CLEAR
CLOSE TABLES all
Select 1
Use D:\二生素数中项合成\偶数的素数对.Dbf Alias 偶数素数对
Select 2
Use D:\二生素数中项合成\二生L24中项.Dbf Alias 广孪中表
kssj=Seconds()
For i=199801 To 200001  &&i 是多余的。用y就可以了
    Wait Transform(i) Window At 3,6 Nowait
    y=i
    X=2*i
* Y=X/2
    s=0
    Select 2
    Locate For 二24中>X
*!*     DO CASE
*!*     CASE EOF()
*!*     GO Bottom &&已经eof()了,就是BOttom了
*!*     CASE 二24中>X
*!*     SKIP -1
*!*     ENDCASE
**改为
    If Found()
        Skip -1
    Endif
    xjl=1
    djl=Recno()
    T=.T.
    Do While T
        dss=二24中
        Go xjl
        xss=二24中
*!*     IF xss=<Y OR dss>=Y
*!*     t=.T. &&多余本来就是.t.,如果不是,就退出Do While了
*!*     ELSE
*!*     t=.F.
*!*     ENDIF
**改为
        If XSS>Y-1 And dss<Y+1
            T=.F.
        ENDIF
**死循环就是这一条件当i=199819时永无法满足。
        Do Case
            Case xss+dss>X
                Go djl
                Skip -1
                djl=Recno()
            Case xss+dss=X
                s=s+1
            Case xss+dss<X
                Go xjl
                Skip
                xjl=Recno()
                Go djl
        Endcase
    Enddo
   && If xss>=Y Or dss=<Y   这一条件永远不会成立,因为只有它不成立时,才能退出do while循环。
        Select 1
        Append Blank
        Replace 偶数 With X
        Replace 素数对 With s
   && Endif
Endfor
=Messagebox("运行时间:"+Ltrim(Str(Int((Seconds()-kssj)/60)))+"分"+Ltrim(Str(Mod(Seconds()-kssj,60),5,2))+"秒",64,"运行时间提示")
在vfp编程论坛一位网友的帮助下解决了问题。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-7-15 07:30 | 显示全部楼层
SELECT 1
USE D:\二生素数中项合成\素数3165万内.DBF ALIAS 素数表
SELECT 2
USE D:\二生素数中项合成\二生L46中项.DBF ALIAS 二生中项
kssj=SECONDS()
zs=23
For i=1 to 78497
      @ 5,12 say i
    SELECT  1     &&打开盛放素数式的表
    jl=recno()
    PUBLIC A
    A=素数
    COUNT NEXT zs FOR 素数-A=2*zs TO tj
    IF tj=1
         SELECT 2
         APPEND BLANK     &&增加一条空记录
         REPLACE 二46中 WITH A+zs   &&将N值付给素数式
    ENDIF
      SELECT 1
      GO jl+1
   ENDFOR
    =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-7-15 07:32 | 显示全部楼层
LOCAL xjl,djl,ts,xss,dss,kssj,tj
CLEAR
SELECT 1
USE D:\二生素数中项合成\不能被广孪中合成的偶数.DBF ALIAS 广孪中素数对    &&素数对表结构:偶数、统计
SELECT 2
USE D:\二生素数中项合成\二生L30中项.DBF  ALIAS 广孪中表
kssj=SECONDS()
FOR i=100 to 20000
@ 3,6 say i
       X=2*i &&这是在筛选四生素数置数,非寻找不能合成的偶数。
          Y=X/2   &&求出偶数的中值
        SELECT 2
        LOCATE FOR 二30中>X
        DO CASE
                CASE EOF()
                        GO Bottom
                CASE 二30中>X
                        SKIP -1
        ENDCASE
        xjl=1
        djl=RECNO()
        t=.T.
        DO WHILE t
                dss=二30中
                GO xjl
                xss=二30中
                                              &&放在这里比较合适,这里原来显示小素数的值,去掉了。
                IF xss<Y+1 OR dss>Y-1                              &&判断跳出语句如果放在后面,有时出现一个重复素数对
                          t=.T.
                          ELSE
                          t=.F.                                       &&跳出命令
                ENDIF                                               &&结束判断
                DO CASE
                        CASE xss+dss>X
                                GO djl
                                SKIP -1
                                djl=RECNO()
                        CASE xss+dss=X
                                EXIT
                        CASE xss+dss<X
                                GO xjl
                                SKIP
                                xjl=RECNO()
                                GO djl
                ENDCASE
        ENDDO
        IF xss>Y OR dss<Y
        SELECT 1
        APPEND BLANK
        REPLACE 偶数 WITH X
        REPLACE 二生间距 WITH 30
        ENDIF
ENDFOR
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
200以后无
回复 支持 反对

使用道具 举报

发表于 2021-7-15 10:08 | 显示全部楼层
LOCAL xjl,djl,ts,xss,dss,kssj,tj
CLEAR
SELECT 1
USE D:\二生素数中项合成\不能被广孪中合成的偶数.DBF ALIAS 广孪中素数对    &&素数对表结构:偶数、统计
SELECT 2
USE D:\二生素数中项合成\二生L36中项.DBF  ALIAS 广孪中表
kssj=SECONDS()
FOR i=100 to 20000
@ 3,6 say i
       X=2*i &&这是在筛选四生素数置数,非寻找不能合成的偶数。
          Y=X/2   &&求出偶数的中值
        SELECT 2
        LOCATE FOR 二36中>X
        DO CASE
                CASE EOF()
                        GO Bottom
                CASE 二36中>X
                        SKIP -1
        ENDCASE
        xjl=1
        djl=RECNO()
        t=.T.
        DO WHILE t
                dss=二36中
                GO xjl
                xss=二36中
                                              &&放在这里比较合适,这里原来显示小素数的值,去掉了。
                IF xss<Y+1 OR dss>Y-1                              &&判断跳出语句如果放在后面,有时出现一个重复素数对
                          t=.T.
                          ELSE
                          t=.F.                                       &&跳出命令
                ENDIF                                               &&结束判断
                DO CASE
                        CASE xss+dss>X
                                GO djl
                                SKIP -1
                                djl=RECNO()
                        CASE xss+dss=X
                                EXIT
                        CASE xss+dss<X
                                GO xjl
                                SKIP
                                xjl=RECNO()
                                GO djl
                ENDCASE
        ENDDO
        IF xss>Y OR dss<Y
        SELECT 1
        APPEND BLANK
        REPLACE 偶数 WITH X
        REPLACE 二生间距 WITH 36
        ENDIF
ENDFOR
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
回复 支持 反对

使用道具 举报

发表于 2021-7-15 15:23 | 显示全部楼层
LOCAL xjl,djl,ts,xss,dss,kssj,tj
CLEAR
SELECT 1
USE D:\二生素数中项合成\不能被广孪中合成的偶数.DBF ALIAS 广孪中素数对    &&素数对表结构:偶数、统计
SELECT 2
USE D:\二生素数中项合成\二生L32中项.DBF  ALIAS 广孪中表
kssj=SECONDS()
FOR i=100 to 10000
@ 3,6 say i
       X=6*i &&这是在筛选四生素数置数,非寻找不能合成的偶数。
          Y=X/2   &&求出偶数的中值
        SELECT 2
        LOCATE FOR 二32中>X
        DO CASE
                CASE EOF()
                        GO Bottom
                CASE 二32中>X
                        SKIP -1
        ENDCASE
        xjl=1
        djl=RECNO()
        t=.T.
        DO WHILE t
                dss=二32中
                GO xjl
                xss=二32中
                                              &&放在这里比较合适,这里原来显示小素数的值,去掉了。
                IF xss<Y+1 OR dss>Y-1                              &&判断跳出语句如果放在后面,有时出现一个重复素数对
                          t=.T.
                          ELSE
                          t=.F.                                       &&跳出命令
                ENDIF                                               &&结束判断
                DO CASE
                        CASE xss+dss>X
                                GO djl
                                SKIP -1
                                djl=RECNO()
                        CASE xss+dss=X
                                EXIT
                        CASE xss+dss<X
                                GO xjl
                                SKIP
                                xjl=RECNO()
                                GO djl
                ENDCASE
        ENDDO
        IF xss>Y OR dss<Y
        SELECT 1
        APPEND BLANK
        REPLACE 偶数 WITH X
        REPLACE 二生间距 WITH 32
        ENDIF
ENDFOR
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
回复 支持 反对

使用道具 举报

发表于 2021-7-15 15:38 | 显示全部楼层
Local xjl,djl,ts,xss,dss,kssj,tj
CLEAR
CLOSE TABLES all
Select 1
Use D:\二生素数中项合成\偶数的素数对.Dbf Alias 偶数素数对
Select 2
Use D:\二生素数中项合成\二生L32中项.Dbf Alias 广孪中表
kssj=Seconds()
For i=99901 To 100000  &&i 是多余的。用y就可以了
    Wait Transform(i) Window At 3,6 Nowait
    y=3*i
    X=6*i
* Y=X/2
    s=0
    Select 2
    Locate For 二32中>X
*!*     DO CASE
*!*     CASE EOF()
*!*     GO Bottom &&已经eof()了,就是BOttom了
*!*     CASE 二24中>X
*!*     SKIP -1
*!*     ENDCASE
**改为
    If Found()
        Skip -1
    Endif
    xjl=1
    djl=Recno()
    T=.T.
    Do While T
        dss=二32中
        Go xjl
        xss=二32中
*!*     IF xss=<Y OR dss>=Y
*!*     t=.T. &&多余本来就是.t.,如果不是,就退出Do While了
*!*     ELSE
*!*     t=.F.
*!*     ENDIF
**改为
        If XSS>Y-1 And dss<Y+1
            T=.F.
        ENDIF
**死循环就是这一条件当i=199819时永无法满足。
        Do Case
            Case xss+dss>X
                Go djl
                Skip -1
                djl=Recno()
            Case xss+dss=X
                s=s+1
            Case xss+dss<X
                Go xjl
                Skip
                xjl=Recno()
                Go djl
        Endcase
    Enddo
   && If xss>=Y Or dss=<Y   这一条件永远不会成立,因为只有它不成立时,才能退出do while循环。
        Select 1
        Append Blank
        Replace 偶数 With X
        Replace 素数对 With s
   && Endif
Endfor
=Messagebox("运行时间:"+Ltrim(Str(Int((Seconds()-kssj)/60)))+"分"+Ltrim(Str(Mod(Seconds()-kssj,60),5,2))+"秒",64,"运行时间提示")
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-7-16 10:15 | 显示全部楼层
LOCAL xjl,djl,ts,xss,dss,kssj,tj
CLEAR
SELECT 1
USE D:\二生素数中项合成\不能被广孪中合成的偶数.DBF ALIAS 广孪中素数对    &&素数对表结构:偶数、统计
SELECT 2
USE D:\二生素数中项合成\二生L34中项.DBF  ALIAS 广孪中表
kssj=SECONDS()
FOR i=100 to 10000
@ 3,6 say i
       X=6*i &&这是在筛选四生素数置数,非寻找不能合成的偶数。
          Y=X/2   &&求出偶数的中值
        SELECT 2
        LOCATE FOR 二34中>X
        DO CASE
                CASE EOF()
                        GO Bottom
                CASE 二34中>X
                        SKIP -1
        ENDCASE
        xjl=1
        djl=RECNO()
        t=.T.
        DO WHILE t
                dss=二34中
                GO xjl
                xss=二34中
                                              &&放在这里比较合适,这里原来显示小素数的值,去掉了。
                IF xss<Y+1 OR dss>Y-1                              &&判断跳出语句如果放在后面,有时出现一个重复素数对
                          t=.T.
                          ELSE
                          t=.F.                                       &&跳出命令
                ENDIF                                               &&结束判断
                DO CASE
                        CASE xss+dss>X
                                GO djl
                                SKIP -1
                                djl=RECNO()
                        CASE xss+dss=X
                                EXIT
                        CASE xss+dss<X
                                GO xjl
                                SKIP
                                xjl=RECNO()
                                GO djl
                ENDCASE
        ENDDO
        IF xss>Y OR dss<Y
        SELECT 1
        APPEND BLANK
        REPLACE 偶数 WITH X
        REPLACE 二生间距 WITH 34
        ENDIF
ENDFOR
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-7-16 14:56 | 显示全部楼层
LOCAL xjl,djl,ts,xss,dss,kssj,tj
CLEAR
SELECT 1
USE D:\二生素数中项合成\不能被广孪中合成的偶数.DBF ALIAS 广孪中素数对    &&素数对表结构:偶数、统计
SELECT 2
USE D:\二生素数中项合成\二生L38中项.DBF  ALIAS 广孪中表
kssj=SECONDS()
FOR i=100 to 100000
@ 3,6 say i
       X=6*i &&这是在筛选四生素数置数,非寻找不能合成的偶数。
          Y=X/2   &&求出偶数的中值
        SELECT 2
        LOCATE FOR 二38中>X
        DO CASE
                CASE EOF()
                        GO Bottom
                CASE 二38中>X
                        SKIP -1
        ENDCASE
        xjl=1
        djl=RECNO()
        t=.T.
        DO WHILE t
                dss=二38中
                GO xjl
                xss=二38中
                                              &&放在这里比较合适,这里原来显示小素数的值,去掉了。
                IF xss<Y+1 OR dss>Y-1                              &&判断跳出语句如果放在后面,有时出现一个重复素数对
                          t=.T.
                          ELSE
                          t=.F.                                       &&跳出命令
                ENDIF                                               &&结束判断
                DO CASE
                        CASE xss+dss>X
                                GO djl
                                SKIP -1
                                djl=RECNO()
                        CASE xss+dss=X
                                EXIT
                        CASE xss+dss<X
                                GO xjl
                                SKIP
                                xjl=RECNO()
                                GO djl
                ENDCASE
        ENDDO
        IF xss>Y OR dss<Y
        SELECT 1
        APPEND BLANK
        REPLACE 偶数 WITH X
        REPLACE 二生间距 WITH 38
        ENDIF
ENDFOR
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
回复 支持 反对

使用道具 举报

发表于 2021-7-16 18:34 | 显示全部楼层
LOCAL xjl,djl,ts,xss,dss,kssj,tj
CLEAR
SELECT 1
USE D:\二生素数中项合成\不能被广孪中合成的偶数.DBF ALIAS 广孪中素数对    &&素数对表结构:偶数、统计
SELECT 2
USE D:\二生素数中项合成\二生L46中项.DBF  ALIAS 广孪中表
kssj=SECONDS()
FOR i=100 to 100000
@ 3,6 say i
       X=6*i &&这是在筛选四生素数置数,非寻找不能合成的偶数。
          Y=X/2   &&求出偶数的中值
        SELECT 2
        LOCATE FOR 二46中>X
        DO CASE
                CASE EOF()
                        GO Bottom
                CASE 二46中>X
                        SKIP -1
        ENDCASE
        xjl=1
        djl=RECNO()
        t=.T.
        DO WHILE t
                dss=二46中
                GO xjl
                xss=二46中
                                              &&放在这里比较合适,这里原来显示小素数的值,去掉了。
                IF xss<Y+1 OR dss>Y-1                              &&判断跳出语句如果放在后面,有时出现一个重复素数对
                          t=.T.
                          ELSE
                          t=.F.                                       &&跳出命令
                ENDIF                                               &&结束判断
                DO CASE
                        CASE xss+dss>X
                                GO djl
                                SKIP -1
                                djl=RECNO()
                        CASE xss+dss=X
                                EXIT
                        CASE xss+dss<X
                                GO xjl
                                SKIP
                                xjl=RECNO()
                                GO djl
                ENDCASE
        ENDDO
        IF xss>Y OR dss<Y
        SELECT 1
        APPEND BLANK
        REPLACE 偶数 WITH X
        REPLACE 二生间距 WITH 46
        ENDIF
ENDFOR
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
回复 支持 反对

使用道具 举报

发表于 2021-7-16 18:40 | 显示全部楼层
Local xjl,djl,ts,xss,dss,kssj,tj
CLEAR
CLOSE TABLES all
Select 1
Use D:\二生素数中项合成\偶数的素数对.Dbf Alias 偶数素数对
Select 2
Use D:\二生素数中项合成\二生L46中项.Dbf Alias 广孪中表
kssj=Seconds()
For i=99901 To 100000  &&i 是多余的。用y就可以了
    Wait Transform(i) Window At 3,6 Nowait
    y=3*i
    X=6*i
* Y=X/2
    s=0
    Select 2
    Locate For 二46中>X
*!*     DO CASE
*!*     CASE EOF()
*!*     GO Bottom &&已经eof()了,就是BOttom了
*!*     CASE 二24中>X
*!*     SKIP -1
*!*     ENDCASE
**改为
    If Found()
        Skip -1
    Endif
    xjl=1
    djl=Recno()
    T=.T.
    Do While T
        dss=二46中
        Go xjl
        xss=二46中
*!*     IF xss=<Y OR dss>=Y
*!*     t=.T. &&多余本来就是.t.,如果不是,就退出Do While了
*!*     ELSE
*!*     t=.F.
*!*     ENDIF
**改为
        If XSS>Y-1 And dss<Y+1
            T=.F.
        ENDIF
**死循环就是这一条件当i=199819时永无法满足。
        Do Case
            Case xss+dss>X
                Go djl
                Skip -1
                djl=Recno()
            Case xss+dss=X
                s=s+1
            Case xss+dss<X
                Go xjl
                Skip
                xjl=Recno()
                Go djl
        Endcase
    Enddo
   && If xss>=Y Or dss=<Y   这一条件永远不会成立,因为只有它不成立时,才能退出do while循环。
        Select 1
        Append Blank
        Replace 偶数 With X
        Replace 素数对 With s
   && Endif
Endfor
=Messagebox("运行时间:"+Ltrim(Str(Int((Seconds()-kssj)/60)))+"分"+Ltrim(Str(Mod(Seconds()-kssj,60),5,2))+"秒",64,"运行时间提示")
因为算法设计,大小论,从两端往中间靠拢,挤压,有大小之分,所以是单记法。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-20 04:06 , Processed in 0.093580 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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