| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 10974 人关注过本帖
标题:用删除法编写一个制作素数表的vfp程序
只看楼主 加入收藏
laowan001
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:66
帖 子:1092
专家分:2686
注 册:2015-12-30
收藏
得分:0 
回复 120楼 独木星空
几点小建议

程序代码:
* 建议一
y0=0
y1=0
y2=0
y3=0
y4=0
y5=0
y6=0
y7=0
y8=0
y9=0
y10=0
&& 改成下面语句
DIMENSION yy[11]    && yy数组取代变量y0~y10
FOR i=1 TO alen(yy)
    yy[i] = 0
ENDFOR 

* 建议二
  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

&& 改成下面语句
ys=MOD(hz,11)
yy[ys+1] = yy[ys+1] + 1


* 建议三
  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值付给素数式

&& 改成下面语句          
FOR i=1 TO alen(yy)
    INSERT INTO 模m余数统计 (m余,统计) VALUES (i-1,yy[i])
ENDFOR


[此贴子已经被作者于2021-10-9 16:46编辑过]

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

素数问题的解决是我学习编程永恒的动力。
2021-10-10 07:12
laowan001
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:66
帖 子:1092
专家分:2686
注 册:2015-12-30
收藏
得分:0 
  APPEND BLANK     &&增加一条空记录
  REPLACE m余 WITH 10 &&将B值付给素数式
  REPLACE 统计 WITH y10 &&将B值付给素数式

同一条记录多个字段赋值可以写在同一行
  APPEND BLANK     &&增加一条空记录
  REPLACE m余 WITH 10,统计 WITH y10     &&将B值付给素数式,将B值付给素数式
2021-10-10 10:53
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:71
帖 子:939
专家分:683
注 册:2016-6-29
收藏
得分:0 
回复 123楼 laowan001
谢谢!laowan001先生的建议。

素数问题的解决是我学习编程永恒的动力。
2021-10-11 08:52
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:71
帖 子:939
专家分:683
注 册: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
sam_jiang
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:790
专家分:1170
注 册:2021-10-13
收藏
得分:0 
求素数其实是个算法的问题,最简单的是穷举法,很简单就可以实现:
**下面的小程序可以迅速判断一个数是不是素数。
PARAMETERS lnNumber
LOCAL nYushu,i
IF lnnumber =1
    RETURN .t.
ENDIF
i=2
DO WHILE .t.
    IF i=lnnumber
        RETURN .t.               
    ELSE
        nyushu=MOD(lnNumber,i)
        IF nyushu=0
            RETURN .f.
        ELSE
            i=i+1
            LOOP
        ENDIF
    ENDIF   
ENDDO

当然,穷举法计算量比较大,还可以对程序进行优化,以提高运算速度。
1,直接筛除个位数是偶数的数,2除外。
2,直接筛除个位数是5的数,5除外。
3,各位数加起来和为3,6,9的(反复加),可以被3整除。
4,素数的个位数就只能是:1,3,7,9了,只要判定最后一位不是这4个数,肯定不是素数。
5,可以设置一个数组,用来保存从头遍历得到的素数(去掉2,3,5)。
6,遍历数组里的每个数,当除数,和穷举的数相除,没有的余数的肯定不是素数。
7,遍历整个数组下来,还有余数的,肯定是素数,再把它加入数组。

以上应该是目前最优算法,不服的可以出来交流。代码自己修改完成吧。。。
2021-10-13 09:57
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:71
帖 子:939
专家分:683
注 册: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
来 自:河北省曲阳县
等 级:版主
威 望:71
帖 子:939
专家分:683
注 册:2016-6-29
收藏
得分:0 
回复 126楼 sam_jiang
你可以晒一晒你的代码,运行一下就知道优劣了。在本主题下,吹水佬的代码运行速度最快。还给出了,dll文件。只不过,没有按着设计要求去做,不能嫁接到其他应用程序中去。如果用了素数表,以及数据源表,就可以简单变形,计算其他相关联问题。

素数问题的解决是我学习编程永恒的动力。
2021-10-13 11:40
sam_jiang
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:790
专家分:1170
注 册:2021-10-13
收藏
得分:0 
FoxPro是伪编译的,运行速度比其他语言慢的,用API估计是要快点的。
下面是纯FoxPro的,你看看需要多少时间,不同的机器配置,跑起来时间估计也相差大的。

PARAMETERS lnNumber
lnnumber=10000 &&调试用
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))
    ENDFOR
    IF n>9
        n=geweihe(n)
    ENDIF
ENDIF
    RETURN n
ENDFUNC
2021-10-13 15:31
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:71
帖 子:939
专家分:683
注 册: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
快速回复:用删除法编写一个制作素数表的vfp程序
数据加载中...
 
   



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

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