| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 11377 人关注过本帖
标题:优化程序或者从新编写求四生素数中项不能合成的偶数
只看楼主 加入收藏
laowan001
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:66
帖 子:1094
专家分:2693
注 册:2015-12-30
收藏
得分:0 
回复 128楼 独木星空
程序代码:
SELECT 1
USE G:\三角递增法\四生素数表中.DBF ALIAS 四中表
SELECT 2
USE G:\三角递增法\各段四生素数个数安整周期.DBF ALIAS 四生个数表细分周期
SELECT 3
USE G:\三角递增法\偶数表新密.DBF ALIAS 偶数表新密
kssj=SECONDS()
bwjm="偶数周期表"

 For i=2 to 100
      @ 5,12 say i
      wd=bwjm+ALLTRIM(STR(i-1))
      USE IN 3
      USE G:\三角递增法\偶数表新密.DBF ALIAS 偶数表新密
       SELECT 3
     
       DELETE ALL
       PACK
       FOR j=1 TO INT(i/2)
        @ 15,22 say j
        SELECT  2     
        GO j
        zgs1=总个数
        fgs1=分个数
...

这是你说的第一步,你想把哪里改成变量赋值?
2021-11-16 21:01
laowan001
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:66
帖 子:1094
专家分:2693
注 册:2015-12-30
收藏
得分:0 
我觉得你说的应该是第二步
2021-11-16 21:23
laowan001
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:66
帖 子:1094
专家分:2693
注 册:2015-12-30
收藏
得分:0 
程序代码:
      IF MOD(n,5)=1
        s=s+30
      ENDIF
      IF MOD(n,5)=2
        s=s+90
      ENDIF
      IF MOD(n,5)=3
        s=s+120
      ENDIF
      IF MOD(n,5)=4
        s=s+180
      ENDIF
      IF MOD(n,5)=0
        s=s+210
      ENDIF
     

改成
程序代码:
    do case 
    case MOD(n,5)=1
        s=s+30
    case MOD(n,5)=2
        s=s+90
    case MOD(n,5)=3
        s=s+120
    case MOD(n,5)=4
        s=s+180
    case MOD(n,5)=0
        s=s+210
    endcase
     

效率会高些
2021-11-16 21:25
laowan001
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:66
帖 子:1094
专家分:2693
注 册:2015-12-30
收藏
得分:0 
回复 128楼 独木星空
“整个问题有238表,分成了14块,每块处理17个表”。
238个表,为什么要分成14块?是方法的要求,还是因为打开表太多?分成20块是不是也可以

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

2021-11-16 21:28
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:71
帖 子:966
专家分:683
注 册:2016-6-29
收藏
得分:0 
回复 132楼 laowan001
你理解的不错,在整个问题上是第二步。
第一步是制作偶数周期表(即参与运算的元素,两两相加的和值,相同的偶数只保留一个)。
当把偶数制作完成后,开始处理这238个偶数周期表,17个一组(实际上,除了第一次外循环外,都是18个一组,因为第二次外循环时,要把上一次的最后一个表连上,即从上一次外循环的最后一个表开始,加上本次的,共计18个偶数周期表),这步的处理是,比对周期表中与那五类值没有的数值,即找出来,例如偶数表2中有30,120,210,300,380;但是没有180这个值,在210周期内,应该能合成30,(60),90,120,(150),180,210;这五个值,小括号内的不能被合成,不在考虑之内。在5个可以被合成数中,90无解,180无解,这些值会存放到:无偶数表总表,中。当把本次的2至17个偶数表,排查完,就完成了本次整体循环。
    如果,我想运行下一个外循环值(即第二组,偶数周期表17,到偶数周期表34),这时我需要把第一的表,手工改成它们(原来的第一次是偶数周期表2至 偶数周期表17),现在变成偶数周期表17,至偶数周期表34;接下来执行第三组,偶数周期表34,至偶数周期表51;.....,在这个上一组数据,到下一组数据中,我是手工改写的工作区,表名,及别名。
     先生既然有了语句直接打开一个空闲工作区,那就不用考虑工作区号问题了;表别名也省略了,那么表别名也不用考虑了,只考虑如何把表名称改写成下一组表名即可。
      因为第一次外循环,与后边的外循环不配套,所以可以从第二组(第二个外循环开始),第二组处理数据为表17到表34;第三组处理数据为:表34到表51;第四组处理数据为表51到表68;....,以此类推,第14组处理数据为:表221到表238.可以看出,每次实际上是处理18个表(总有一个表与上次交叉)。
     我是手工改写14次,完成这项工作的,现在想两次完成这项工作,第一次处理第一组数据,表2到表17;第二步完成第二组数据到第14组数据(每组处理18个偶数周期表),问第二步如何用变量赋值,把表名改成当次处理的表名。

素数问题的解决是我学习编程永恒的动力。
2021-11-16 22:06
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:71
帖 子:966
专家分:683
注 册:2016-6-29
收藏
得分:0 
回复 134楼 laowan001
不是方法的要求。目的是缩小表的容量,表太大,有时会超过vfp的极限。也可以说,是人为的,根据数据量的大小而定,分步处理,为好多类似问题考虑,有的情况下,可能一次就能处理完毕,也不需要分组(划段)处理;但是有的情况下,分成14块也不行,可能划分成100组,都是根据具体情况而定。

素数问题的解决是我学习编程永恒的动力。
2021-11-16 22:13
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:71
帖 子:966
专家分:683
注 册:2016-6-29
收藏
得分:0 
回复 134楼 laowan001
与打开的表多少无关,只是与数据量的大小有关(vfp可以最多有32767个工作区,而实际上最多同时打开255个工作区,是这样吗?无论是与不是,我的算法要求分成若干组(块)进行处理,而不是一次性处理,无论从数据量上,vfp的上限上,最重要的是想处理类似问题,每种类似问题,大多情况下数据量较大,不宜一次处理)。
    至于划分14个板块,还是20个,或者其他的板块数,除了数据量的考虑外,还要考虑它是不是表总数(238个表)的约数,14*17=238,如果用20,就不能分成标准的14个外循环值(一个外循环值,处理一个组,一段连续的表)。

素数问题的解决是我学习编程永恒的动力。
2021-11-16 22:25
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:71
帖 子:966
专家分:683
注 册:2016-6-29
收藏
得分:0 
回复 132楼 laowan001
在这种处理中,还要考虑一个问题,外循坏一次,要存一次无偶数总表,所以每次需要给它一个表名,不要提前建表,每次外循环后,创建一个表盛放数据即可。
     把这第二步处理完,剩下的活,就简单了。

素数问题的解决是我学习编程永恒的动力。
2021-11-16 22:29
laowan001
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:66
帖 子:1094
专家分:2693
注 册:2015-12-30
收藏
得分:0 
程序代码:
SELECT 239
USE G:\三角递增法\无偶数表总表.DBF ALIAS 无偶数总表
SELECT 187
USE G:\三角递增法\偶数周期表187.DBF ALIAS 偶周期187
SELECT 188
USE G:\三角递增法\偶数周期表188.DBF ALIAS 偶周期188
SELECT 189
USE G:\三角递增法\偶数周期表189.DBF ALIAS 偶周期189
SELECT 190
USE G:\三角递增法\偶数周期表190.DBF ALIAS 偶周期190
SELECT 191
USE G:\三角递增法\偶数周期表191.DBF ALIAS 偶周期191
SELECT 192
USE G:\三角递增法\偶数周期表192.DBF ALIAS 偶周期192
SELECT 193
USE G:\三角递增法\偶数周期表193.DBF ALIAS 偶周期193
SELECT 194
USE G:\三角递增法\偶数周期表194.DBF ALIAS 偶周期194
SELECT 195
USE G:\三角递增法\偶数周期表195.DBF ALIAS 偶周期195
SELECT 196
USE G:\三角递增法\偶数周期表196.DBF ALIAS 偶周期196
SELECT 197
USE G:\三角递增法\偶数周期表197.DBF ALIAS 偶周期197
SELECT 198
USE G:\三角递增法\偶数周期表198.DBF ALIAS 偶周期198
SELECT 199
USE G:\三角递增法\偶数周期表199.DBF ALIAS 偶周期199
SELECT 200
USE G:\三角递增法\偶数周期表200.DBF ALIAS 偶周期200
SELECT 201
USE G:\三角递增法\偶数周期表201.DBF ALIAS 偶周期201
SELECT 202
USE G:\三角递增法\偶数周期表202.DBF ALIAS 偶周期202
SELECT 203
USE G:\三角递增法\偶数周期表203.DBF ALIAS 偶周期203
SELECT 204
USE G:\三角递增法\偶数周期表204.DBF ALIAS 偶周期204
kssj=SECONDS()
bwjm="偶周期"
For j=187 to 204
      @ 5,12 say j
     k=j
      wd=bwjm+ALLTRIM(STR(j))
&& CLOSE DATABASES
&& SET COMPATIBLE ON
&& OPEN DATABASE (HOME(2) + 'data\testdata')

&& SELECT 1  && 未使用的工作区

 && USE  G:\三角递增法\&WD ALIAS n && 打开 Customer 表
      For i=(j-1)*500000+1 to (j+1)*500000

      @ 5,12 say i
      n=i
      s=0
      IF MOD(n,5)=1
      s=s+30
      ENDIF
      IF MOD(n,5)=2
      s=s+90
      ENDIF
      IF MOD(n,5)=3
      s=s+120
      ENDIF
      IF MOD(n,5)=4
      s=s+180
      ENDIF
      IF MOD(n,5)=0
      s=s+210
      ENDIF
     
      wou=INT((n-1)/5)*210+s
      SELECT "偶周期"+ALLTRIM(STR(k))
      
      
         && select G:\三角递增法\&WD..DBF IN 0
       A=偶数
         IF A=wou
         SELECT "偶周期"+ALLTRIM(STR(k))
         skip
         LOOP
         ELSE
         SELECT 239
         APPEND BLANK
         REPLACE 无偶 WITH wou
         ENDIF
   
     ENDFOR
ENDFOR
    =MESSAGEBOX("运行时间:"+LTRIM(STR(INT((SECONDS()-kssj)/60)))+"分"+LTRIM(STR(MOD(SECONDS()-kssj,60),5,2))+"秒",64,"运行时间提示")


在for j=187 to 204循环体中,只用到了一个表  SELECT "偶周期"+ALLTRIM(STR(k)) ,是这样吧?
另:在循环体中,j的值未变化过,k=j,k值也没变化过,那就没必要k=j了,直接用j就可以
2021-11-17 08:04
独木星空
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:河北省曲阳县
等 级:版主
威 望:71
帖 子:966
专家分:683
注 册:2016-6-29
收藏
得分:0 
回复 139楼 laowan001
直接用j也行。你这楼引用的是第12次外循环,在手工改两次就全部完成了。这只是14个外循环,每次改动18个表名,但是如果在多,这样手工改写表名就不现实了。在第一步时,反复改写程序才使产生的偶数周期表名与外循环值相关联。

素数问题的解决是我学习编程永恒的动力。
2021-11-17 08:37
快速回复:优化程序或者从新编写求四生素数中项不能合成的偶数
数据加载中...
 
   



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

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