数学中国

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

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

  [复制链接]
 楼主| 发表于 2021-2-1 19:02 | 显示全部楼层
SELECT 1
USE D:\回到本源\素数式.dbf ALIAS 素数式
SELECT 2
USE D:\回到本源\余数表.dbf ALIAS 余数表
SELECT 3
USE D:\回到本源\素数表千万级.dbf ALIAS 素数表
kssj=SECONDS()  &&取出开始时间
SELECT 1
  k=RECCOUNT()
  go bottom
  max=素式
SELECT 3
   GO 1
    s=1
       FOR  j=1 TO 6125798
        SELECT 3
        p=素数
        IF p<=max
           SELECT 2
           DELETE all
            PACK
          SELECT 1
            go 1
           for j=1 to k
           sss=素式
           ys=mod(sss,p)
           SELECT 2
           count all for ys=余数 to js
                    IF js=0
                    SELECT 2
                    APPEND BLANK
                     REPLACE 余数 WITH ys &&改成本次追加记录的字段
                     ENDIF
                SELECT 1
                skip
              endfor
              SELECT 2
               jl=RECCOUNT()
               s=s*p^(k-1)*(p-jl)/(p-1)^k
              
        else
        
        s=s*p^(k-1)*(p-k)/(p-1)^k
        endif
         SELECT 3
               skip
endfor
?s
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-3 10:02 | 显示全部楼层
把Excel中的计算过程翻译成算法,这是一门编程艺术,也是一门数学艺术,它们是相辅相成的,没有数学语言,就没算法,它们相得益彰。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-3 10:10 | 显示全部楼层
算法可以使人一劳永逸,而在Excel中获得数据,就得从头开始,每步都得从新操作,不会牵一发而动全身,算法可以改变初十值,一石激起千层浪。但是只有在excel中,才更能了解开始做什么,下一步怎么做,也就说,它是算法的指示灯,每前进一步,就会有一个新的蓝图构造出来。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-3 12:55 | 显示全部楼层
SELECT 1
USE D:\表示算法\标准域.dbf ALIAS 标准域
SELECT 2
USE D:\表示算法\余数表.dbf ALIAS 余数表
kssj=SECONDS()                      &&取出开始时间
      SELECT 1
       go 1
    && ys=0
       s1=0
   for i=1  to  8
       s1=s1+1
       SELECT 1
       go s1
       hzs1=互质数
          && jlh1=recn()
          && ys=mod(ys+hzs1,30)
       SELECT 1
        go 1
        s2=0
         for j=1  to  8
           s2=s2+1
             SELECT 1
             go s2
             hzs2=互质数
             && jlh2=recn()
              && ys=mod(ys+hzs2,30)
             SELECT 1
              go 1
               s3=0
               for l=1  to  8
               s3=s3+1
                 SELECT 1
                  go s3
                  hzs3=互质数
                  && jlh3=recn()
                  && ys=mod(ys+hzs3,30)
                    SELECT 1
                    go 1
                    s4=0
                  for m=1 to 8
                  s4=s4+1
                  SELECT 1
                  go s4
                   hzs4=互质数
                     && jlh4=recn()
                   ys=mod(hzs1+hzs2+hzs3+hzs4,30)
                    SELECT 2
                    APPEND BLANK
                    REPLACE 余数 WITH ys &&改成本次追加记录的字段              
                    endfor
                 endfor
            endfor
     endfor
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
这个程序经过6,7次的改动,最终才显示正确结果。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-3 12:56 | 显示全部楼层
SELECT 1
USE D:\表示算法\余数统计.dbf ALIAS 余统计
SELECT 2
USE D:\表示算法\余数表.dbf ALIAS 余数表
kssj=SECONDS()                      &&取出开始时间
    SELECT 2
       for i=1 to 15
         ys=2*(i-1)
         count all  for ys=余数 to tj
                    SELECT 1
                    APPEND BLANK
                    REPLACE 余数 WITH ys &&改成本次追加记录的字段   
                    REPLACE 统计 WITH tj &&改成本次追加记录的字段           
              SELECT 2
              go 1
      endfor
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
这是统计余数出现的次数
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-3 17:47 | 显示全部楼层
SELECT 1
USE D:\表示算法\标准域.dbf ALIAS 标准域
SELECT 2
USE D:\表示算法\余数表.dbf ALIAS 余数表
kssj=SECONDS()                      &&取出开始时间
      SELECT 1
       go 1
    && ys=0
       s1=0
   for i=1  to  8
       s1=s1+1
       SELECT 1
       go s1
       hzs1=互质数
          && jlh1=recn()
          && ys=mod(ys+hzs1,30)
       SELECT 1
        go 1
        s2=0
         for j=1  to  8
           s2=s2+1
             SELECT 1
             go s2
             hzs2=互质数
             && jlh2=recn()
              && ys=mod(ys+hzs2,30)
             SELECT 1
              go 1
               s3=0
               for l=1  to  8
               s3=s3+1
                 SELECT 1
                  go s3
                  hzs3=互质数
                  && jlh3=recn()
                  && ys=mod(ys+hzs3,30)
                    SELECT 1
                    go 1
                    s4=0
                  for m=1 to 8
                  s4=s4+1
                  SELECT 1
                  go s4
                   hzs4=互质数
                     && jlh4=recn()
                      SELECT 1
                    go 1
                    s5=0
                  for g=1 to 8
                  s5=s5+1
                  SELECT 1
                  go s5
                   hzs5=互质数
                   ys=mod(hzs1+hzs2+hzs3+hzs4+hzs5,30)
                    SELECT 2
                    APPEND BLANK
                    REPLACE 余数 WITH ys &&改成本次追加记录的字段              
                    endfor
                    endfor
                 endfor
            endfor
     endfor
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
加一层嵌套在容易不过了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-4 09:19 | 显示全部楼层
刚刚把制作素数程序稍微改变了一下,变成了二生素数统计程序(在素数样本区间上)。出了结果就把程序贴上来。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-4 10:24 | 显示全部楼层
为了解决储存量的限制,我们可以合二为一,即把合成数直接打分,而不是先做出来,再统计。一步到位,一边合成,一边打分,合成结束,分配结束,一次性完成任务。不分步完成任务。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-4 11:40 | 显示全部楼层
SELECT 1
USE D:\表示算法\标准域.dbf ALIAS 标准域
SELECT 2
USE D:\表示算法\合成数表.dbf ALIAS 合数表
kssj=SECONDS()                      &&取出开始时间
      SELECT 1
       go 1
    && ys=0
    js1=0
    js2=0
    js3=0
    js4=0
    js5=0
    js6=0
    js7=0
    js8=0
    js9=0
    js10=0
       s1=0
   for i=1  to  40
       s1=s1+1
       SELECT 1
       go s1
       hzs1=互质数
          && jlh1=recn()
          && ys=mod(ys+hzs1,30)
       SELECT 1
        go 1
        s2=0
         for j=1  to  40
           s2=s2+1
             SELECT 1
             go s2
             hzs2=互质数
             && jlh2=recn()
              && ys=mod(ys+hzs2,30)
             SELECT 1
              go 1
               s3=0
               for l=1  to  40
               s3=s3+1
                 SELECT 1
                  go s3
                  hzs3=互质数
                  && jlh3=recn()
                  && ys=mod(ys+hzs3,30)
                    SELECT 1
                    go 1
                    s4=0
                  for m=1 to 40
                  s4=s4+1
                  SELECT 1
                  go s4
                   hzs4=互质数
                     && jlh4=recn()
                      SELECT 1
                    go 1
                    s5=0
                  for g=1 to 40
                  s5=s5+1
                  SELECT 1
                  go s5
                   hzs5=互质数
                   hcs=hzs1+hzs2+hzs3+hzs4+hzs5
                  
                       if hcs>140 and hcs<120
                       else
                       do case  
                        case hcs=121
                         js1=js1+1
                         case hcs=123
                         js2=js2+1
                         case hcs=125
                         js3=js3+1
                         case hcs=127
                         js4=js4+1
                         case hcs=129
                         js5=js5+1
                         case hcs=131
                         js6=js6+1
                         case hcs=133
                         js7=js7+1
                         case hcs=135
                         js8=js8+1
                         case hcs=137
                         js9=js9+1
                         case hcs=139
                         js10=js10+1

                         endcase

                         endif        
                    endfor
                    endfor
                 endfor
            endfor
     endfor
      ?js1
      ?js2
      ?js3
      ?js4
      ?js5
      ?js6
      ?js7
      ?js8
      ?js9
      ?js10
=MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
这是个一气呵成的程序,从制作合成数,到统计合成数的数量。二合一程序。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-4 13:16 | 显示全部楼层
SELECT 1
USE D:\素数表文件\素数表亿.DBF ALIAS 素数亿
SELECT 3
USE D:\素数表文件\素数百亿.DBF ALIAS 素数表百亿
SELECT 2
USE D:\素数表文件\二生素数统计.DBF ALIAS 二统计
kssj=SECONDS()
    For N=1 to 5
    @ 5,12 say N
       tj=0
       erm=2^N*5
        SELECT 3
        go 1
        for m=1 to 1000000
        bpz=素数+erm
        Kf=INT(SQRT(bpz))       &&求出奇数的开方根
        SELECT  1             &&打开素数表
        LOCATE FOR 素数>=kf      &&根据开方根,查找最大素数
        DO CASE
                CASE EOF()          &&如果超出素数表最后一条记录
                        GO BOTTOM
                CASE 素数>kf     &&如果找到的素数比开方根值大,就将记录指针退回一个,保证使用的最大素数在开方根内
                        SKIP -1
        ENDCASE
        SSS=RECNO()    &&记录下最大素数(开方根内)记录位置(如果找到的素数等于开方根,则直接读取这个素数的位置)
        GO 8           &&从第一条记录开始读取素数(3)
        FOR j=1 TO SSS-7       &&内循环开始。这个循环实质上是从小到大顺序,依次读取素数。循环值是记录序号
                qmz=MOD(bpz,素数)   &&以读取的素数为条件,对被判断值求模 【qmz=MOD(bpz,素数)】文本号括着的原在此行语句体部分.特别需要注意的是在用标点符号时,一定改成英文模式及半角状态。
                IF qmz=0
                        EXIT         
                ENDIF
                SKIP            &&素数表指针向下移动一个
        ENDFOR
        IF j>sss-7
        tj=tj+1  
        ENDIF
        SELECT 3
        skip
        ENDFOR
                 SELECT  2      &&打开盛放素数的表
                APPEND BLANK                        &&增加一条空记录
                REPLACE 二m WITH erm            &&将N值付给素数
                REPLACE 统计 WITH tj  
    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 09:07 , Processed in 0.097670 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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