标题:用删除法编写一个制作素数表的vfp程序
取消只看楼主
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:57
帖 子:713
专家分:556
注 册:2016-6-29
得分:0 
SELECT 1
USE D:\nm抽取m个数\模m余数统计.DBF ALIAS 模m余数统计
kssj=SECONDS()
y0=0
y1=0
y2=0
y3=0
y4=0
y5=0
y6=0
y7=0
y8=0
y9=0
y10=0
x=11*2+1 && m已经作为一个变量存在,所以文件大的没边,形成了1.9亿的记录条
    For i=1 to x
      FOR j=i+1  TO x+1
         FOR h=j+1  TO x+2
         FOR k=h+1  TO x+3
         FOR m=k+1  TO x+4
         FOR u=m+1  TO x+5
         FOR v=u+1  TO x+6
         FOR z1=v+1  TO x+7
         FOR z2=z1+1  TO x+8
         FOR z3=z2+1  TO x+9
         FOR z4=z3+1  TO x+10
             hz=i+j+h+k+m+u+v+z1+z2+z3+z4
             ys=MOD(hz,11)
               DO CASE
                  CASE ys=0
                  y0=y0+1
                  CASE ys=1
                  y1=y1+1
                  CASE ys=2
                  y2=y2+1
                  CASE ys=3
                  y3=y3+1
                  CASE ys=4
                  y4=y4+1
                  CASE ys=5
                  y5=y5+1
                  CASE ys=6
                  y6=y6+1
                  CASE ys=7
                  y7=y7+1
                  CASE ys=8
                  y8=y8+1
                  CASE ys=9
                  y9=y9+1
                  CASE ys=10
                  y10=y10+1
                  ENDCASE
          ENDFOR
          ENDFOR
          ENDFOR
         ENDFOR
         ENDFOR
          ENDFOR
          ENDFOR
         ENDFOR
      ENDFOR
      ENDFOR
   ENDFOR
   SELECT  1   &&打开盛放素数式的表
          APPEND BLANK     &&增加一条空记录
          REPLACE m余 WITH 0 &&将B值付给素数式
          REPLACE 统计 WITH y0 &&将B值付给素数式
          APPEND BLANK     &&增加一条空记录
          REPLACE m余 WITH 1 &&将B值付给素数式
          REPLACE 统计 WITH y1 &&将B值付给素数式
          APPEND BLANK     &&增加一条空记录
          REPLACE m余 WITH 2 &&将B值付给素数式
          REPLACE 统计 WITH y2 &&将B值付给素数式
          APPEND BLANK     &&增加一条空记录
          REPLACE m余 WITH 3 &&将B值付给素数式
          REPLACE 统计 WITH y3 &&将B值付给素数式
          APPEND BLANK     &&增加一条空记录
          REPLACE m余 WITH 4 &&将B值付给素数式
          REPLACE 统计 WITH y4 &&将B值付给素数式
          APPEND BLANK     &&增加一条空记录
          REPLACE m余 WITH 5 &&将B值付给素数式
          REPLACE 统计 WITH y5 &&将B值付给素数式
          APPEND BLANK     &&增加一条空记录
          REPLACE m余 WITH 6 &&将B值付给素数式
          REPLACE 统计 WITH y6 &&将B值付给素数式
          APPEND BLANK     &&增加一条空记录
          REPLACE m余 WITH 7 &&将B值付给素数式
          REPLACE 统计 WITH y7 &&将B值付给素数式
          APPEND BLANK     &&增加一条空记录
          REPLACE m余 WITH 8 &&将B值付给素数式
          REPLACE 统计 WITH y8 &&将B值付给素数式
          APPEND BLANK     &&增加一条空记录
          REPLACE m余 WITH 9 &&将B值付给素数式
          REPLACE 统计 WITH y9 &&将B值付给素数式
          APPEND BLANK     &&增加一条空记录
          REPLACE m余 WITH 10 &&将B值付给素数式
          REPLACE 统计 WITH y10 &&将B值付给素数式
    =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
这是几抽几组和问题。主要是对for循环语句的运用。

素数问题的解决是我学习编程永恒的动力。
2021-10-09 16:28
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:57
帖 子:713
专家分:556
注 册:2016-6-29
得分:0 
回复 121楼 laowan001
简练而精华。因为当时对数组方面的运用还不太了解,所以就用了那种语句。再就是do case语句很少运用,用的最多的就是for循环语句,其次do while语句。
    最后的增加记录值就用过APPEND BLANK 语句,基本上在程序中没有用过其他方法添加记录过。
    谢谢laowan001的改进。

素数问题的解决是我学习编程永恒的动力。
2021-10-10 07:12
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:57
帖 子:713
专家分:556
注 册:2016-6-29
得分:0 
回复 123楼 laowan001
谢谢!laowan001先生的建议。

素数问题的解决是我学习编程永恒的动力。
2021-10-11 08:52
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:57
帖 子:713
专家分:556
注 册:2016-6-29
得分:0 
回复 121楼 laowan001
SELECT 1
USE D:\问题x+2y的素数解\素数表.DBF ALIAS 素数表
SELECT 2
USE D:\问题x+2y的素数解\余数表.DBF ALIAS 余数表
kssj=SECONDS()
FOR k=1  TO 10
SELECT 1
GO k
ds=素数 &&ds对素之意
DIMENSION yy[ds]    && yy数组取代变量y0~y10
FOR i=1 TO alen(yy)
    yy[i] = 0
ENDFOR
SELECT 1
GO 1
FOR j=1 TO 32767
ss=素数
ys=MOD(ss,ds)
yy[ys+1] = yy[ys+1] + 1
SELECT 1
SKIP
endfor
    FOR h=1 TO alen(yy)
    INSERT INTO 余数表 (对素,余数,统计) VALUES (ds,h-1,yy[h])
    ENDFOR
endfor        
    =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
今天安照laowan001先生的建议制作了另外一个类似程序(打分素数)

素数问题的解决是我学习编程永恒的动力。
2021-10-13 08:35
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:57
帖 子:713
专家分:556
注 册:2016-6-29
得分:0 
SELECT 1
USE D:\问题x+2y的素数解\素数表亿.DBF ALIAS 素数表亿
SELECT 2
USE D:\问题x+2y的素数解\余数表.DBF ALIAS 余数表
kssj=SECONDS()
FOR k=1  TO 10
SELECT 1
GO k
ds=素数 &&ds对素之意
DIMENSION yy[ds]    && yy数组取代变量y0~y10
FOR i=1 TO alen(yy)
    yy[i] = 0
ENDFOR
SELECT 1
GO 1
FOR j=1 TO 5761454
ss=素数
ys=MOD(ss,ds)
yy[ys+1] = yy[ys+1] + 1
SELECT 1
SKIP
endfor
    FOR h=1 TO alen(yy)
    INSERT INTO 余数表 (对素,余数,统计) VALUES (ds,h-1,yy[h])
    ENDFOR
endfor        
    =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
运行时间:0分59.54秒,不到1分钟,而那个32767的运行0.36秒。

素数问题的解决是我学习编程永恒的动力。
2021-10-13 11:31
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:57
帖 子:713
专家分:556
注 册:2016-6-29
得分:0 
回复 126楼 sam_jiang
你可以晒一晒你的代码,运行一下就知道优劣了。在本主题下,吹水佬的代码运行速度最快。还给出了,dll文件。只不过,没有按着设计要求去做,不能嫁接到其他应用程序中去。如果用了素数表,以及数据源表,就可以简单变形,计算其他相关联问题。

素数问题的解决是我学习编程永恒的动力。
2021-10-13 11:40
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:57
帖 子:713
专家分:556
注 册:2016-6-29
得分:0 
回复 129楼 sam_jiang
PARAMETERS lnNumber  &&参数
lnnumber=100000 &&调试用
LOCAL nYushu,i,nlen,nlast,ashuzu,m,k  &&本地的,我理解为声明
timestart=SECONDS()  &&计时开始
ndecimals=SET("Decimals" ) &&集
SET DECIMALS TO 0  &&将小数设置为
K=5
nlen=0
i=1
DO WHILE lnnumber>i
    IF INLIST(i,1,2,3,5,7,9) &&如果输入
        nlen=nlen+1        
        DIMENSION ashuzu[nlen] &&尺寸
        ashuzu[nlen]=i
        i=i+1
        loop
    ENDIF

    IF INLIST(i,0,4,6,8) &&如果输入
        i=i+1
        loop
    ENDIF
    ***剔除能被2,5整除的数***
    nlast=VAL(RIGHT(ALLTRIM(str(i)),1))&&右侧所有直径,我理解为取字符串的右边第一个值
    IF !INLIST(nlast,1,3,7,9)&&非,如果输入,!是逻辑非
        i=i+1
        loop
    ENDIF
    ***剔除能被3整除的数***
    m=geweihe(i)
    IF INLIST(m,3,6,9) &&如果输入
        i=i+1
        LOOP
    ELSE
    ***除此之外的数,去除以数组里的素数,如果余数为零则不是素数。***
        K=5
        DO WHILE k<=nlen
            nyushu=MOD(i,ashuzu[k])
            IF nyushu=0
                i=i+1
                exit
            ELSE
                k=k+1
                loop   
            ENDIF
        ENDDO                    
        nlen=nlen+1
        DIMENSION ashuzu[nlen]
        ashuzu[nlen]=i
        i=i+1
        loop            
    ENDIF     
   
ENDDO
timeend=SECONDS()&&结束时间
?timeend-timestart

FUNCTION geweihe  &&函数
***这个函数返回各位数反复相加最后得到一个个位数***
PARAMETERS nshu  &&参数
n=0
IF nshu>9
    FOR j=1 TO LEN(allt(STR(nshu)))
        n=n+VAL(SUBSTR(ALLTRIM((STR(nshu))),j,1)) && SUBSTR 底座,我理解为取字符串中几个字符,包含如何取法
    ENDFOR
    IF n>9
        n=geweihe(n)
    ENDIF
ENDIF
    RETURN n
ENDFUNC
你的方法是安照你自己的流程图做的,或者说,按照你的算法编写的,在10000时,用时1.231;在100000时,87.994.你回头看一看别人的,特别是吹水佬版主的,那简直无法比,实际上算法最快的就是划出法,即把所有数排列成一排,从2开始划掉其倍数,接着下一3,再接着5,一直划下去就可以了,没有被划掉的就是素数。
你的方法只是测试了时间,没有成果,即无素数表产生,也有统计功能,报出有多少个素数,这有什么用处,只是用来链机器的,还是用来提高编写程序能力的,提的再高,没有应用,又有何用?

素数问题的解决是我学习编程永恒的动力。
2021-10-13 22:09
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:57
帖 子:713
专家分:556
注 册:2016-6-29
得分:0 
回复 129楼 sam_jiang
我的目的是通过,数据源,参照素数表,制作更大的素数表;而不是判断一个数是否为素数。

素数问题的解决是我学习编程永恒的动力。
2021-10-14 06:50
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:57
帖 子:713
专家分:556
注 册:2016-6-29
得分:0 
回复 132楼 sam_jiang
我这个人是接受各种算法的,不论它的运算速度如何,统统吸纳。来强化自己编写程序的能力,只用自己的方法,永远接触不到更多的语句,命令,函数等信息。
    在这个问题上:吹水佬版主的运行速度最快,而且给提供dll文件,只不过没有用到我所提供的材料,也只能计算到32位(2^32)的2倍大,再大,就溢出了。
     而最符合题意的是:laowan001先生的,速度基本上也可以,最重要的是可以移植,嫁接到其他程序中,这是我最看重的地方。
     先生的思路,和流程图也别具一格。能不能适应更大应用就不知道了。

素数问题的解决是我学习编程永恒的动力。
2021-10-14 10:46
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:57
帖 子:713
专家分:556
注 册:2016-6-29
得分:0 
编写一个程序求Q(奇数)减2的n次方其值没有素数的奇数
猜想每一个奇数(大于等于5的)都可以表示成一个素数+2^n形式,编写一个vb6程序,寻找一亿内的反例。例如1048573这个数,它小于2^20=1048576,也就是1048573-2^n这个式子中的n可以从1取到19,在这19次取值中,其结果假设没有素数,则次数是一个反例,其中有一次是素数,就不是反例,程序设计中,也可以考虑,当为真时,跳出循环,执行下一个奇数。最好先制作素数表,或许也不快,不如直接判断,比起判断一个数是否为素数要容易的多(是指运算时间上)。大概就这么个意思,有不清楚的地方,在商榷。
这是发在vb6上的一个帖子,有兴趣的做一做。

素数问题的解决是我学习编程永恒的动力。
2021-10-16 05:47



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-506838-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.645082 second(s), 8 queries.
Copyright©2004-2025, BCCN.NET, All Rights Reserved