本帖最后由 sanmoking 于 2010-1-25 18:57 编辑
0.3秒快不?
代码隐藏,afan要多多加分啊。。。
上边的代码有问题,
如果数组最后边有0,1之类的数在得到51+8+37+7=103结果之后就不会再往下计算了,
比如51+8+37+7+1=104,更不会有51+8+37+7+1+0=104,现更正如下:
#include <Array.au3>
Dim $aArray[15] = [51, 8, 13, 2, 52, 61, 37, 85, 19, 11, 7, 62, 22, 38, 79];~ _ArraySort($aArray)
GUICreate("", 400, 620)
GUICtrlCreateEdit("", 10, 10, 380, 600)
$coo = 0 ;存储计算次数
$com = 0;存储正确结果数量
$num = UBound($aArray) - 1 ;计算数组最后一位
$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 $num
$resx = $resd + $aArray[$i]
$txtx = $txtd & $aArray[$i] & "+"
$coo += 1
If $resx <= 102 Then
mimi($i + 1, $resx, $txtx)
ElseIf $resx > 102 And $resx < 105 Then
GUICtrlSetData(-1, StringReplace($txtx & "=", "+=", "=") & $resx&@CRLF,1)
$com += 1
;~ --------------------------------下边这句必须加上的-----------------------
mimi($i + 1, $resx, $txtx)
;~ -------------------------------------------------------------------------
EndIf
Next
EndFunc ;==>mimi
;~ 之所以犯错,就是因为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了
;~ 本代码上面的数组最后添加一个0,就会发现结果是92个,因为添加了一个0,所以46个结果每个加上0,还是符合的,所以结果翻了一倍变成92个了. |