标题:用删除法编写一个制作素数表的vfp程序
只看楼主
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:57
帖 子:713
专家分:556
注 册:2016-6-29
得分:0 
回复 98楼 吹水佬
cDefPath = ADDBS(JUSTPATH(SYS(16)))
SET DEFAULT TO (cDefPath)
DECLARE LONG CreatePrime IN Prime LONG,LONG,STRING@
t = SECONDS()
CreatePrime(4280000001,4310000001,cDefPath+"Prime143.txt")
? SECONDS()-t
t = SECONDS()
CreatePrime(4310000001,4340000001,cDefPath+"Prime144.txt")
? SECONDS()-t
"Prime142.txt "时还没有出错,因为它的最大值是4280000000,而整数限制2147483647*2=4294967294,还小于它。
而到"Prime143.txt "时就出错了,运行时间0.008秒,文件为空白,即没有存数据;
"Prime144.txt "时运行时间123.583秒,文件存储的数据都是8位数(千万级别)。

只能算到最大素数0xFFFFFFEF?它是不是整数溢出(即最大整数值),我对它不太了解,我以为是9999999999,十位数最大值。

素数问题的解决是我学习编程永恒的动力。
2021-09-21 19:41
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
回复 101楼 独木星空
VFP是32位应用,32位无符号整数最大值‭4294967295‬(0xFFFFFFFF)
再大就会溢出

[此贴子已经被作者于2021-9-21 20:11编辑过]

2021-09-21 20:08
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:57
帖 子:713
专家分:556
注 册:2016-6-29
得分:0 
回复 102楼 吹水佬
明白了:2^32=4294967296

素数问题的解决是我学习编程永恒的动力。
2021-09-21 21:43
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:57
帖 子:713
专家分:556
注 册:2016-6-29
得分:0 
回复 82楼 laowan001
laowan001先生提供的方法是我需要的方法,他用了数据源及素数表,这样可以把同类问题一块解决。先生有空时能不能用数组的方法,方式代替内循环中的处理数据,那种算法发上来,我好学习学习(虽然,您已经说了运算速度也差不多)。

素数问题的解决是我学习编程永恒的动力。
2021-09-29 06:52
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:57
帖 子:713
专家分:556
注 册:2016-6-29
得分:0 
回复 102楼 吹水佬
吹水佬版主的算法用时最少,速度最快。计算范围是2*2^32.再大,就溢出了。(只好把制作100亿内的素数表暂时搁置,现在已有40亿内的素数表了,每10亿划分一个表,有四个素数表)。再次感谢吹水佬版主的付出,和辛勤劳作,给我提供了优质的制作素数程序。我以前制作10亿的素数表,哩哩啦啦用了20天的时间。所以,还得沉下心,努力向大家学习。

素数问题的解决是我学习编程永恒的动力。
2021-09-29 07:01
wengjl
Rank: 14Rank: 14Rank: 14Rank: 14
等 级:贵宾
威 望:108
帖 子:2175
专家分:3785
注 册:2007-4-27
得分:0 
js.rar (31.39 KB)

只求每天有一丁点儿的进步就可以了
2021-09-29 16:04
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:57
帖 子:713
专家分:556
注 册:2016-6-29
得分:0 
回复 106楼 wengjl
昨天下载,大概看了一下,还没有应用。祝您,国庆节快乐!

素数问题的解决是我学习编程永恒的动力。
2021-09-30 08:56
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:57
帖 子:713
专家分:556
注 册:2016-6-29
得分:0 
CREATE CURSOR tt(bol L,num I)
仅这个语句就解释了一堆:
create cursor 创建光标
alias_name(alias是别名之意) [codepage(代码页)=nCodepage]
      (fname1  type(类型) [(precision(精确度)[,scale])
 scale n.(相对的)大小,规模,范围;尺度;标度;等级表;级别表;比例;比例尺;音阶;鳞;
 标准;级别;标尺;刻度尺;(测试心智发展等的)量表;(鳞翅目昆虫的)翅瓣;(皮肤的)鳞屑;
 鳞片;铁鳞;(金属在高温下形成的)氧化层,氧化皮;梯子;楼梯;
 [null | not null ][check IExpvession (检查报告)[ERROR cMessageText]]   错误信息传送
null  零.(我原来认为是空值之意,即单元格为空白,没有填写内容的单元格)
 adj.无法律效力的;无效的;无价值的;无用的;无意义的;无特色的;无特点的;不存在的;一无所有的;
 数量为零的;零的;空的;极限为零的;(测量仪器)零读数的,读数为零的;
 [Autoinc [Nextvalue  Nextvalue[stepValue ]]]
汽车工业?  下一个值             阶梯值
[Default,eExpression] [unique [collate cCollate Sequence]]
违约       表达式      独特的
adj.唯一的;独一无二的;独特的;无与伦比的;无可匹敌的;独有的;特有的;唯一(结果)的;唯一(值)的;
 collate 核对
 vt.校对;核对;对照;(图书馆工作中)核对,检查(书籍页码及其顺序);检验(印张顺序);
 授予(教区牧师)有俸职位;
 序列 Sequence
 [nocptrans][,fname2....]) |From array arrayName
  在线翻译还是原字母              数组
这是在线翻译获得的意思,形而上学的用是用了,真不知所以然。

素数问题的解决是我学习编程永恒的动力。
2021-10-02 19:43
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:57
帖 子:713
专家分:556
注 册:2016-6-29
得分:0 
DIMENSION Fib[20]
Fib[1]=1
Fib[2]=1
FOR i=3 TO 20
    n=i
   Fib[n]=Fib[n-1]+Fib[n-2]
   ?Fib[n]
 ENDFOR
今天简单的学习了下,数组的运用。上边的小程序,输出了从3到20的斐波那契数列的值(Fibonacci)

素数问题的解决是我学习编程永恒的动力。
2021-10-03 15:56
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:57
帖 子:713
专家分:556
注 册:2016-6-29
得分:0 
CLEAR
SELECT 1
USE D:\标记法\数据源表.DBF ALIAS 数据源
SELECT 2
USE D:\标记法\素数表5万.DBF ALIAS 素数表参
SELECT 5
USE D:\标记法\素数表结果.DBF ALIAS 素数表果
kssj=SECONDS()                     
FOR i=5 TO 6
@12,10 SAY i
dimension  arr[1658880]
SELECT 1
GO 1
    FOR j=1 TO 1658880
    arr[j]=素数式+(i-1)*9699690
    SELECT 1
    SKIP
    ENDFOR
      bpz=i*9699690
      Kf=INT(SQRT(bpz))
      SELECT 2
      GO 1
      COUNT ALL FOR 素参<=kf TO jlh  && jlh=RECNO()
      xhcs=jlh-8 &&xhcs是循环次数的简写(第一个字母代替)
      SELECT 2   
      GO 9
      FOR k=1 TO xhcs
       sc=素参
            FOR h=1 TO 1658880
                IF arr[h]>0
                  if MOD(arr[h],sc)=0
                   arr[h]=0
                   endif
                 ENDIF
             ENDFOR
       SELECT 2
       skip
       ENDFOR
           FOR l=1 TO 1658880
           IF  arr[l]>0
           SELECT 5
           APPEND BLANK
           REPLACE 素数 WITH arr[l]
           ENDIF
           ENDFOR
 ENDFOR
 =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")
这是用数组代替,数据表a和数据表b后的程序。运行时间:17分49.91秒。
比起最开始用3和4表时,50分16.70秒快了不少,比起laowan001的程序1026秒还是稍微慢点,如果按吹水佬版主的建议,把查询最大素数记录条的语句改成乘法运算,或许比开方运算快点,不过一个外循环只判断一次,估计提高不了多少。
在用到数据源及素数表的情况下,不知道是否还可以进一步优化?
当然在这个问题处理上,吹水佬版主的程序运行最快,包括后来给的dll文件,更是一流,美中不足之处,就是不能嫁接移植到别的程序中去,因为没有用到数据源及素数表(前提条件,单纯的制作素数用处有点窄)。

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



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




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

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