关于afan的"任意N个数字组合"问题,sanmoking的代码似乎有问题哦..
本帖最后由 gapkiller 于 2010-1-26 09:14 编辑原帖:
http://www.autoitx.com/forum.php?mod=viewthread&tid=12470&extra=page%3D2
下面是sanmoking的算法.
数组后面加了个1, 结果就不对啦, 显然结果不全.
Dim $aArray =
;Dim $aArray =
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
不过如果先做一下arraysort($aArray)结果就对了 我也不清楚是怎么回事。。。 看了代码也没什么问题啊。。 如果要先排序一下数组,可能就会扰乱结果的排序了。。 因为程序里计算到 102<结果<105 就跳出来啦
其实应该接着循环,直到结果>=105
其实, 即使先排序, 有些情况也是不行滴
应该是算法有问题啦 我发现问题了。改好再发。 本帖最后由 sanmoking 于 2010-1-25 18:38 编辑
Dim $aArray =
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 本帖最后由 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种算法 神速啊....崇拜ing 可是我很负责地告诉你,还是不对哦....
不然你arraysort一下看看
结果不一样哦....
哎,sanmoking要疯了... 哈哈,没疯,找到问题了.
If $resx < 102 Then
ElseIf $resx > 102 And $resx < 106 Then
应该是
If $resx <= 102 Then
ElseIf $resx > 102 And $resx < 106 Then 你随便你arraysort一下吧,哈哈,赶紧加分
页:
[1]