非典男人 发表于 2010-1-20 12:25:18

都是牛人 顶一下

顽固不化 发表于 2010-1-20 12:25:53

第一个计算耗时:333.820359850204 毫秒。
看来我的电脑老了点

sanmoking 发表于 2010-1-20 12:32:30

回复sanmoking


    高手就是高手,学习了~!
afan 发表于 2010-1-20 12:24 http://www.autoitx.com/images/common/back.gif


    我是菜鸟啊,老大,可不是高手,接触au3之前什么都不懂的。。。。。正则都不会,dos也不会,api跟wmi都分不清。。。。

顽固不化 发表于 2010-1-20 12:38:26

我是菜鸟啊,老大,可不是高手,接触au3之前什么都不懂的。。。。。正则都不会,dos也不会,api跟 ...
sanmoking 发表于 2010-1-20 12:32 http://www.autoitx.com/images/common/back.gif

不管怎样,你的代码很干练的。
递归我也考虑,但想了半天无果

sanmoking 发表于 2010-1-20 12:40:57

啥叫递归?

顽固不化 发表于 2010-1-20 13:09:48

啥叫递归?
sanmoking 发表于 2010-1-20 12:40 http://www.autoitx.com/images/common/back.gif

函数自己调用自己

catcher 发表于 2010-1-20 13:26:13

看看高深的东西

雨林GG 发表于 2010-1-20 14:09:26

高手有高招,俺菜鸟自叹不如!

kodin 发表于 2010-1-20 15:50:11

:face (13):我刚试了一下自己写一个,发现居然要NN秒...

supersp 发表于 2010-1-20 16:37:30

本帖最后由 supersp 于 2010-1-20 16:54 编辑

我这里跑起来71ms...应该还能更快一点
#Include <Array.au3>

$begin = TimerInit()
Dim $aArray =
_ArraySort($aArray)
Global $mArray,$oArray,$display
$oArray=0
For $v1 In $aArray
        Switch $v1
                Case 1 To 57
                        _ArrayAdd($mArray,$v1)
                Case 58 To 105
                        _ArrayAdd($oArray,$v1)
        EndSwitch
Next
_ArrayDelete($mArray, 0)
For $v2 = 0 To UBound($oArray)-1
        _xh($oArray[$v2],String($oArray[$v2]),UBound($mArray))
Next

Func _xh($var,$str,$n)
        For $i = $n To 0 Step -1
                $num = Execute("$var + $mArray[$i]")
                Switch $num
                        Case 105 To 1500
                                ContinueLoop
                        Case 102 To 105
                                _ArrayAdd($display,$str&"+"&String($mArray[$i])&"="&String($num))
                        Case 1 To 102
                                _xh($num,$str&"+"&String($mArray[$i]),$i-1)
                EndSwitch
        Next
EndFunc
_ArrayDelete($display, 0)
$dif = TimerDiff($begin)
_ArrayDisplay($display,"耗时:"&$dif)

supersp 发表于 2010-1-20 16:56:55

本帖最后由 supersp 于 2010-1-20 17:03 编辑

试了把 UBound($mArray) 单独提出来赋值,速度提高了3ms左右
编译exe后,运行..34ms..
=.=
来点分吧..

afan 发表于 2010-1-20 17:30:04

回复 25# supersp


    很不错的,就是前面多了个0(15个数字中并未包含0),还有,之前可能没说清楚,数值范围应该是大于102,小于105,也就是103 or 104。
效率的确高,感谢参与~!

llztt 发表于 2010-1-20 17:45:56

现在流行玩算法啊,呵呵

supersp 发表于 2010-1-20 17:46:03

有个0 是因为 我把 58-105之间的数字 x 提出来了, 因为 x 只会用到一次,用到2次就肯定超过105了,所以不用参与递归
这点提高不少效率,但是不用到 x ,只1-57 之间的数字 y自加也会有符合的值,所以我添加了一个0,表示 x 数组没有参与计算..
当然0在输出时,可以想办法去掉

还有排序数组后,当数字较小的都>105时,那么排在后面较大的数字就肯定不符合了
所以 _xh($num,$str&"+"&String($mArray[$i]),$i-1)   上标参数就是$i-1, 在下次循环时就剔除了当前数字,和排在这个数字后面的部分。
这也提高不少效率。

至于103.104 判断改下就可以了

afan 发表于 2010-1-20 17:52:35

回复 29# supersp


    嗯,解释得很详细,学习~
页: 1 [2] 3 4 5 6 7
查看完整版本: 从一组数字中任意组合N个数字,使之和在某个数值范围