找回密码
 加入
搜索
查看: 2115|回复: 12

关于afan的"任意N个数字组合"问题,sanmoking的代码似乎有问题哦..

[复制链接]
发表于 2010-1-25 12:01:16 | 显示全部楼层 |阅读模式
本帖最后由 gapkiller 于 2010-1-26 09:14 编辑

原帖:
http://www.autoitx.com/forum.php ... &extra=page%3D2

下面是sanmoking的算法.
数组后面加了个1, 结果就不对啦, 显然结果不全.
Dim $aArray[15] = [51, 8, 13, 2, 52, 61, 37, 85, 19, 11, 7, 62, 22, 38, 79]
;Dim $aArray[16] = [51, 8, 13, 2, 52, 61, 37, 85, 19, 11, 7, 62, 22, 38, 79, 1]
GUICreate("",400,320)
GUICtrlCreateList("",10,10,380,300)

Global $Count=0
$begin = TimerInit()
$msg=""
mimi(0,0,"")
$dif = TimerDiff($begin)
GUICtrlSetData(-1, "共 "&$Count&" 种方式   耗时: "&$dif)

GUISetState()
While GUIGetMsg()+3
WEnd

Func mimi($k,$resd,$txtd)
        If $k < UBound($aArray) Then
                For $i = $k To UBound($aArray) - 1 
                        $resx = $resd + $aArray[$i]
                        $txtx = $txtd & $aArray[$i] & "+"
                        If $resx <= 102 Then mimi($i+1,$resx,$txtx)
                        If $resx > 102 And $resx < 105 Then
                                GUICtrlSetData(-1, StringReplace($txtx & "=", "+=", "=") & $resx)
                                $Count += 1
                                         mimi($i+1,$resx,$txtx)  ; 加上这句就对了...
                        EndIf
                        $resx = $resd
                Next
        EndIf 
EndFunc
 楼主| 发表于 2010-1-25 12:01:53 | 显示全部楼层
不过如果先做一下arraysort($aArray)结果就对了
发表于 2010-1-25 16:02:14 | 显示全部楼层
我也不清楚是怎么回事。。。
发表于 2010-1-25 16:03:32 | 显示全部楼层
看了代码也没什么问题啊。。
发表于 2010-1-25 16:04:35 | 显示全部楼层
如果要先排序一下数组,可能就会扰乱结果的排序了。。
 楼主| 发表于 2010-1-25 16:18:01 | 显示全部楼层
因为程序里计算到 102<结果<105 就跳出来啦
其实应该接着循环,直到结果>=105

其实, 即使先排序, 有些情况也是不行滴

应该是算法有问题啦
发表于 2010-1-25 17:16:38 | 显示全部楼层
我发现问题了。改好再发。
发表于 2010-1-25 17:33:58 | 显示全部楼层
本帖最后由 sanmoking 于 2010-1-25 18:38 编辑
Dim $aArray[17] = [51, 8, 13, 2, 52, 61, 37, 85, 19, 11, 7, 62, 22, 38, 79,1,0]
GUICreate("", 400, 620)
GUICtrlCreateEdit("", 10, 10, 380, 600)

$coo = 0 ;存储计算次数
$com = 0
$begin = TimerInit();开始计时
mimi(0, 0, "")
$dif = TimerDiff($begin);结束记时



GUICtrlSetData(-1, "计算耗时: " & $dif&@CRLF,1)
GUICtrlSetData(-1, "总计计算了"&$coo&"次加法运算"&@CRLF,1)
GUICtrlSetData(-1, "正确结果有"&$com&"种算法"&@CRLF,1)
GUISetState()
While GUIGetMsg() + 3
WEnd

Func mimi($k, $resd, $txtd)
                For $i = $k To UBound($aArray) - 1
                        $resx = $resd + $aArray[$i]
                        $txtx = $txtd & $aArray[$i] & "+"
                        $coo += 1 
                        If $resx <= 102 Then                                        
                                mimi($i + 1, $resx, $txtx)                        
                        ElseIf $resx > 102 And $resx < 106 Then
                                GUICtrlSetData(-1, StringReplace($txtx & "=", "+=", "=") & $resx&@CRLF,1)
                                $com += 1 
;~ --------------------------------下边这句必须加上的-----------------------                                
                                mimi($i + 1, $resx, $txtx)        
;~ 之所以犯错,就是因为afan的题目直接是103,104两个结果,这两个相差为1,并且它提供的数组里面正好没有1,所以测试一下结果对上46就以为通过了        
;~ 不加上面这句,如果得到一个51+13+2+19+11+7=103的结果,1在7之前,可以把1算上,1在7之后,就不会去计算了
;~ 假如题目要求是100,110之间的结果,那么比如51+13+2+19+11+5+7=108这样的结果就不会得到,
;~ 只会得到51+13+2+19+11+5=101,符合结果范围,就不在去加后边的7了,因为7小于10
;~ 本代码上面的数组你把最后那个0去掉,就会发现结果是140个,因为添加了一个0,所以140个结果每个加上0,还是符合的,所以结果翻了一倍变成280个了.
                        EndIf
                Next
EndFunc   ;==>mimi

评分

参与人数 2金钱 +20 贡献 +1 收起 理由
gapkiller + 1 看那么辛苦改了那么多次,那就给你加点分吧. ...
afan + 20 赶紧把“它”改了 - -||

查看全部评分

发表于 2010-1-25 17:37:41 | 显示全部楼层
本帖最后由 sanmoking 于 2010-1-25 18:39 编辑

51+8+13+2+19+11=104
51+8+13+2+19+11+1=105
51+8+13+2+7+22=103
51+8+13+2+7+22+1=104
51+8+13+19+11+1=103
51+8+13+11+22=105
51+8+2+37+7=105
51+8+2+19+22+1=103
51+8+37+7=103
51+8+37+7+1=104
51+8+7+38=104
51+8+7+38+1=105
51+13+2+37=103
51+13+2+37+1=104
51+13+2+19+11+7=103
51+13+2+19+11+7+1=104
51+13+2+38=104
51+13+2+38+1=105
51+13+19+22=105
51+13+11+7+22=104
51+13+11+7+22+1=105
51+13+38+1=103
51+2+52=105
51+2+19+11+22=105
51+2+11+38+1=103
51+52=103
51+52+1=104
51+19+11+22=103
51+19+11+22+1=104
8+13+2+52+19+11=105
8+13+2+52+7+22=104
8+13+2+52+7+22+1=105
8+13+2+61+19=103
8+13+2+61+19+1=104
8+13+2+61+11+7+1=103
8+13+2+37+7+38=105
8+13+2+19+62=104
8+13+2+19+62+1=105
8+13+2+19+22+38+1=103
8+13+2+11+7+62=103
8+13+2+11+7+62+1=104
8+13+2+79+1=103
8+13+52+19+11=103
8+13+52+19+11+1=104
8+13+52+7+22+1=103
8+13+61+22=104
8+13+61+22+1=105
8+13+37+7+38=103
8+13+37+7+38+1=104
8+13+19+62+1=103
8+13+62+22=105
8+2+52+19+22=103
8+2+52+19+22+1=104
8+2+52+11+7+22+1=103
8+2+61+11+22=104
8+2+61+11+22+1=105
8+2+37+19+38=104
8+2+37+19+38+1=105
8+2+37+11+7+38=103
8+2+37+11+7+38+1=104
8+2+85+7+1=103
8+2+19+11+62+1=103
8+2+11+62+22=105
8+52+37+7=104
8+52+37+7+1=105
8+52+7+38=105
8+61+11+22+1=103
8+37+19+11+7+22=104
8+37+19+11+7+22+1=105
8+37+19+38+1=103
8+37+22+38=105
8+85+11=104
8+85+11+1=105
8+19+11+7+22+38=105
8+11+7+79=105
8+11+62+22=103
8+11+62+22+1=104
13+2+52+37=104
13+2+52+37+1=105
13+2+52+19+11+7=104
13+2+52+19+11+7+1=105
13+2+52+38=105
13+2+61+19+7+1=103
13+2+61+7+22=105
13+2+37+19+11+22=104
13+2+37+19+11+22+1=105
13+2+19+11+22+38=105
13+2+19+7+62=103
13+2+19+7+62+1=104
13+2+11+79=105
13+52+37+1=103
13+52+19+11+7+1=103
13+52+11+7+22=105
13+52+38=103
13+52+38+1=104
13+61+19+11=104
13+61+19+11+1=105
13+61+7+22=103
13+61+7+22+1=104
13+37+19+11+22+1=103
13+85+7=105
13+19+11+62=105
13+19+11+22+38=103
13+19+11+22+38+1=104
13+11+79=103
13+11+79+1=104
13+7+62+22=104
13+7+62+22+1=105
2+52+37+11+1=103
2+52+19+7+22+1=103
2+52+11+38=103
2+52+11+38+1=104
2+61+19+22=104
2+61+19+22+1=105
2+61+11+7+22=103
2+61+11+7+22+1=104
2+37+19+7+38=103
2+37+19+7+38+1=104
2+85+11+7=105
2+19+62+22=105
2+11+7+62+22=104
2+11+7+62+22+1=105
2+62+38+1=103
2+22+79=103
2+22+79+1=104
52+19+11+22=104
52+19+11+22+1=105
61+37+7=105
61+19+22+1=103
37+19+11+38=105
37+7+22+38=104
37+7+22+38+1=105
85+19=104
85+19+1=105
85+11+7=103
85+11+7+1=104
19+7+79=105
19+62+22=103
19+62+22+1=104
11+7+62+22+1=103
计算耗时: 36.3465189011453
总计计算了3554次加法运算
正确结果有140种算法
 楼主| 发表于 2010-1-25 17:41:57 | 显示全部楼层
神速啊....崇拜ing
 楼主| 发表于 2010-1-25 18:02:49 | 显示全部楼层
可是我很负责地告诉你,还是不对哦....
不然你arraysort一下看看
结果不一样哦....

哎,sanmoking要疯了...
发表于 2010-1-25 18:40:07 | 显示全部楼层
哈哈,没疯,找到问题了.
If $resx < 102 Then
ElseIf $resx > 102 And $resx < 106 Then

应该是

If $resx <= 102 Then
ElseIf $resx > 102 And $resx < 106 Then
发表于 2010-1-25 18:41:37 | 显示全部楼层
随便你arraysort一下吧,哈哈,赶紧加分
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-5-4 14:41 , Processed in 0.084572 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表