| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 6726 人关注过本帖
标题:请教怎样在多数据中快速选择出几个数值合并成一个固定的数值?
只看楼主 加入收藏
Tiger5392
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:88
帖 子:2775
专家分:2237
注 册:2006-5-17
收藏
得分:0 
以下是引用软件服务在2011-12-23 14:06:45的发言:

42000,你那个还是有误差

4928.81+5336.60+4486.88+4355.22+4593.67+4583.25+4342.69+1019.31+3868.37+990.98+1714.24+1779.98=42000
用时3.558秒

10秒能找到3个
佩服

感言:学以致用。 博客:http://www./blog/user14/65009/index.shtml email:Tiger5392@
2011-12-23 17:06
软件服务
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:3
帖 子:344
专家分:736
注 册:2011-12-23
收藏
得分:0 
现在做到用2.12秒420000一分不差就找到
2011-12-24 10:06
panpende
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:4
帖 子:528
专家分:963
注 册:2009-4-27
收藏
得分:0 
请教软件服务老师,能否无赏赐教如何做到用2.12秒420000一分不差就找到。谢谢了。
2011-12-25 12:16
软件服务
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:3
帖 子:344
专家分:736
注 册:2011-12-23
收藏
得分:0 
.
2011-12-25 16:56
panpende
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:4
帖 子:528
专家分:963
注 册:2009-4-27
收藏
得分:0 
我尝试一段程序,抛砖引玉。

SET TALK OFF
SET SAFETY OFF
CLEAR ALL
CLOSE DATABASES
CLEAR

*要求在100多个数值中快速挑选出最佳的数值合并成一个已固定数值。(不一定和固定值完一样只要尽可能相近就行,每个数只能选一次。)
TS=420000.00
USE TEST  SHARED
SORT ON A1 /D TO L1
USE L1
ALTER TABLE L1 ADD A3 N(3)
REPLACE ALL A3 WITH RECNO()

SUM A1 TO T1

T10=0
SCAN
T10=T10+A1
IF T10>=TS
TR=RECNO()
EXIT
ENDIF
ENDSCAN
T11=T10-TS
DO Z01
RETURN

PROCEDURE Z01
REPLACE A3 WITH 1 FOR RECNO()<=TR
REPLACE A3 WITH 2 FOR A3<>1
SORT ON A3,A1 TO L2
USE L2
DO Z02 &&1对1替换
RETURN

PROCEDURE Z02 &&1对1替换
COPY TO L3 FOR A3=2 .AND. A1<>0
USE L3 IN 0
SCAN FOR A3=1
TA=A1
SELECT L3
LOCATE FOR TA-A1<T11 .AND. TA-A1>0
IF FOUND()
TB=A1
SELECT L2
REPLACE A3 WITH 2
LOCATE FOR A1=TB
REPLACE A3 WITH 1
DO Z03 &&整理1
ENDIF

SELECT L2
ENDSCAN
DO Z04 &&1对1替换完成
RETURN

PROCEDURE Z03 &&整理1
SELECT L3
USE
SELECT L2
SORT ON A3,A1 TO L4
ZAP
APPEND FROM L4
SUM A1 TO T10 FOR A3=1
T11=T10-TS
?T11
DO Z02 &&继续1对1替换
RETURN

PROCEDURE Z04 &&1对1替换完成
SELECT L3
COPY TO L5
SELECT 0
USE L5
DO Z05 &&1对2替换
RETURN

PROCEDURE Z05 &&1对2替换
SELECT L2
SCAN FOR A3=1
TA=A1
SELECT L3
SCAN
TB=A1
SELECT L5
LOCATE FOR TA-TB-A1<T11 .AND. TA-TB-A1>0
IF FOUND()
TC=A1
SELECT L2
REPLACE A3 WITH 2
LOCATE FOR A1=TB
REPLACE A3 WITH 1
LOCATE FOR A1=TC
REPLACE A3 WITH 1
DO Z06 &&整理2
ENDIF
SELECT L3
ENDSCAN
SELECT L2
ENDSCAN
DO Z07
RETURN

PROCEDURE Z06 &&整理2
CLOSE DATABASES
USE L2
SORT ON A3,A1 TO L4
ZAP
APPEND FROM L4
SUM A1 TO T10 FOR A3=1
T11=T10-TS
?T11
COPY TO L3 FOR A3=2
COPY TO L5 FOR A3=2
USE L3 IN 0
USE L5 IN 0
DO Z05 &&继续1对2替换
RETURN

PROCEDURE Z07 &&程序结束
WAIT '  固定数值是 '+STR(TS,10,2)+' 和是'+STR(T10,10,2)+'  误差 '+STR(T11,4,2)+'  数据在表L2中 (A3=1)  ' WINDOW AT 20,30
CANCEL
RETURN

2011-12-26 10:03
软件服务
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:3
帖 子:344
专家分:736
注 册:2011-12-23
收藏
得分:0 
Sec1=Seco()  && 加
SORT ON A1 /D TO L1
...
DO Z01
Sec2=seco()  && 加
?Sec2-Sec1
RETURN
 
看看时间要多长

[ 本帖最后由 软件服务 于 2011-12-26 10:15 编辑 ]
2011-12-26 10:12
panpende
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:4
帖 子:528
专家分:963
注 册:2009-4-27
收藏
得分:0 
在我的电脑里 运行我的小程序,Sec2-Sec1=0.110

SET TALK OFF
SET SAFETY OFF
CLEAR ALL
CLOSE DATABASES
CLEAR

*要求在100多个数值中快速挑选出最佳的数值合并成一个已固定数值。(不一定和固定值完一样只要尽可能相近就行,每个数只能选一次。)
TS=420000.00
USE TEST  SHARED
SORT ON A1 /D TO L1
USE L1
ALTER TABLE L1 ADD A3 N(3)
REPLACE ALL A3 WITH RECNO()

SUM A1 TO T1
Sec1=Seco()
T10=0
SCAN
T10=T10+A1
IF T10>=TS
TR=RECNO()
EXIT
ENDIF
ENDSCAN
T11=T10-TS
DO Z01
RETURN

PROCEDURE Z01
REPLACE A3 WITH 1 FOR RECNO()<=TR
REPLACE A3 WITH 2 FOR A3<>1
SORT ON A3,A1 TO L2
USE L2
DO Z02 &&1对1替换
RETURN

PROCEDURE Z02 &&1对1替换
COPY TO L3 FOR A3=2 .AND. A1<>0
USE L3 IN 0
SCAN FOR A3=1
TA=A1
SELECT L3
LOCATE FOR TA-A1<T11 .AND. TA-A1>0
IF FOUND()
TB=A1
SELECT L2
REPLACE A3 WITH 2
LOCATE FOR A1=TB
REPLACE A3 WITH 1
DO Z03 &&整理1
ENDIF

SELECT L2
ENDSCAN
DO Z04 &&1对1替换完成
RETURN

PROCEDURE Z03 &&整理1
SELECT L3
USE
SELECT L2
SORT ON A3,A1 TO L4
ZAP
APPEND FROM L4
SUM A1 TO T10 FOR A3=1
T11=T10-TS
?T11
DO Z02 &&继续1对1替换
RETURN

PROCEDURE Z04 &&1对1替换完成
SELECT L3
COPY TO L5
SELECT 0
USE L5
DO Z05 &&1对2替换
RETURN

PROCEDURE Z05 &&1对2替换
SELECT L2
SCAN FOR A3=1
TA=A1
SELECT L3
SCAN
TB=A1
SELECT L5
LOCATE FOR TA-TB-A1<T11 .AND. TA-TB-A1>0
IF FOUND()
TC=A1
SELECT L2
REPLACE A3 WITH 2
LOCATE FOR A1=TB
REPLACE A3 WITH 1
LOCATE FOR A1=TC
REPLACE A3 WITH 1
DO Z06 &&整理2
ENDIF
SELECT L3
ENDSCAN
SELECT L2
ENDSCAN
DO Z07
RETURN

PROCEDURE Z06 &&整理2
CLOSE DATABASES
USE L2
SORT ON A3,A1 TO L4
ZAP
APPEND FROM L4
SUM A1 TO T10 FOR A3=1
T11=T10-TS
?T11
COPY TO L3 FOR A3=2
COPY TO L5 FOR A3=2
USE L3 IN 0
USE L5 IN 0
DO Z05 &&继续1对2替换
RETURN

PROCEDURE Z07 &&程序结束
Sec2=seco()  && 加
? Sec2-Sec1
T15=Sec2-Sec1
WAIT '  固定数值是 '+STR(TS,10,2)+' 和是'+STR(T10,10,2)+'  误差 '+STR(T11,4,2)+'  数据在表L2中 (A3=1) 用时 '+STR(T15,8,4)+'  ' WINDOW AT 20,30
CANCEL
RETURN

收到的鲜花
  • 茵梦湖2011-12-27 22:00 送鲜花  10朵   附言:思路/算法很值得借鉴~
2011-12-26 11:05
软件服务
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:3
帖 子:344
专家分:736
注 册:2011-12-23
收藏
得分:0 
比我的厉害, 是不是精准?
2011-12-26 11:26
panpende
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:4
帖 子:528
专家分:963
注 册:2009-4-27
收藏
得分:0 
这个例题我没有做到误差=0。是否正确,可以执行程序后验证。
2011-12-26 12:14
panpende
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:4
帖 子:528
专家分:963
注 册:2009-4-27
收藏
得分:0 
图片附件: 游客没有浏览图片的权限,请 登录注册



这是我执行程序后的截图。
2011-12-26 12:23
快速回复:请教怎样在多数据中快速选择出几个数值合并成一个固定的数值?
数据加载中...
 
   



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

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