凑凑热闹(计算24)
本帖最后由 netegg 于 2011-6-18 01:56 编辑忽然想起一个题目,算借pusofalse的光,问问大家,我自己也没答案
4组0-10,随机从每一组中挑出一个数,算24,这个大家应该都玩过吧,解是有限的,印象中不超过100组,试试看
(不用枚举解法,只要算得出来就行)
给点提示:可以考虑下递归
不好意思,应该是1到10要不就不对了
时间太长了
给个不完整的答案
这么分组有问题,虽然可以解决大部分,但是5551还是没包括Local $aI = ['+', '-', '*', '/'], $x, $n = 0, $y
For $i = 1 To 10
For $j= 1 To 10
For $w In $aI
$x[$n] = Execute($i & $w & $j)
$y[$n] = $i & $w & $j
$n+=1
Next
Next
Next
For $m = 0 To UBound($x)-1
For $o = 0ToUBound($x)-1
For $w In $aI
If Execute($x[$m] & $w & $x[$o])=24 Then ConsoleWrite('('&$y[$m] &')' &$w &'('& $y[$o]&')='&Execute($x[$m] & $w & $x[$o])&@cr)
Next
Next
Next
好吧,我承认我很笨...
Dim $C=['+', '-', '*', '/']
$str = ''
Dim $res=0
For $i=1 To 10
For $ii=0 To 3
For $j=1 To 10
For $jj=0 To 3
For $k=1 To 10
For $kk=0 To 3
For $l=1 To 10
$msg = $i&$C[$ii]&$j&$C[$jj]&$k&$C[$kk]&$l
If Execute($msg)=24 Then $str &= $msg&'=24' & @TAB
Next
Next
Next
Next
Next
Next
Next
MsgBox(0,0,$str) 好吧,我承认我很笨...
gapkiller 发表于 2010-3-15 22:40 http://www.autoitx.com/images/common/back.gif
............................好...比我的好 我用的是random 回复 2# gapkiller
我也是经常用笨办法。 不好意思 我笨的没看懂 能解释下吗?
Dim $C=['+', '-', '*', '/'] ;这个是定义一个数组 包括4个运算符 对吧
$str = '';要这个干嘛
Dim $res=0;需要0吗?
For $i=1 To 10;从1到10
For $ii=0 To 3;这个干嘛?循环什么?
For $j=1 To 10
For $jj=0 To 3
For $k=1 To 10
For $kk=0 To 3
For $l=1 To 10
$msg = $i&$C[$ii]&$j&$C[$jj]&$k&$C[$kk]&$l;这个是$i里的1到10用数组里运算符和$j里1到10.。。运算?
If Execute($msg)=24 Then $str &= $msg&'=24' & @TAB;执行计算$msg=24就输出。。对吧
Next
Next
Next
Next
Next
Next
Next
MsgBox(0,0,$str)
其实我大概可以明白这个是怎么运行的 但是让我去写 我搞不出来 回复 5# yarsye
七重循环?累了
个人的想法是分两组计算,第一组是1~81,第二组同样,然后从1~9找出1~81的所有组合,再匹配前后两组 有点复杂 简单点 本帖最后由 learn321 于 2010-5-28 19:52 编辑
好吧,我承认我很笨...
gapkiller 发表于 2010-3-15 22:40 http://www.autoitx.com/images/common/back.gif
这是巧妙的算法啊!我加了个计数变量,竟然有3708组符合要求的结果!!:face (13):
不过,我还有个问题,怎样能够过滤掉输出结果中类似于1+2+3*7=24 和2+1+3*7=24 和3*7+1+2=24 和3*7+2+1=24 等实际重复的结果呢?Dim $C=['+', '-', '*', '/']
$str = ''
Dim $t = 0
For $i=1 To 10
For $ii=0 To 3
For $j=1 To 10
For $jj=0 To 3
For $k=1 To 10
For $kk=0 To 3
For $l=1 To 10
$msg = $i&$C[$ii]&$j&$C[$jj]&$k&$C[$kk]&$l
If Execute($msg)=24 Then
$str &= $msg&'=24' & @TAB
$t = $t +1
EndIf
Next
Next
Next
Next
Next
Next
Next
MsgBox(0,"共有"&$t&"组结果为24",$str)
;FileWrite("24.txt",$str) #include <Array.au3>
Dim $begin = TimerInit()
Local $str,$msg1
Local $run=["+","-","*","/"]
Local $array=
$fin=_ArrayCombinations($array,4,",")
;_ArrayDisplay($fin)
For $b=1 To $fin
$aa=StringSplit($fin[$b],",",2)
;_ArrayDisplay($aa)
For $i=0 To 3
For $j=0 To 3
For $k=0 To 3
$msg=$aa&$run[$k]&$aa&$run[$j]&$aa&$run[$i]&$aa
If Execute($msg)=24 Then _ArrayAdd($msg1,$msg&" = 24")
Next
Next
Next
Next
_ArrayDisplay($msg1,TimerDiff($begin)) 本帖最后由 netegg 于 2010-6-4 02:31 编辑
回复 9# 3mile
时间方面不错,不过不对,5551没有 本帖最后由 3mile 于 2010-6-4 09:04 编辑
回复 10# netegg
第五行定义数组中只用1-10,可定义 Local $array=
可惜算法还是太肉,4组运行非常慢。
更不敢再加入()运算符了,如果使用还要加入5种运算。
穷举法实在太肉。
。。。
暂时没有更好的办法。
召唤达人出现。 关注这种智力题,蛋蛋你自己呢 mark...等下做~~ 智力题除了基础知识的运用,还包括作者的编程思想,通常后者是衡量是否是一个优秀程序员的标准。 同意楼上的,一个代码可以看出一个人态度
页:
[1]
2