netegg 发表于 2010-3-15 22:09:40

凑凑热闹(计算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

gapkiller 发表于 2010-3-15 22:40:00

好吧,我承认我很笨...
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)

rolaka 发表于 2010-3-15 22:57:16

好吧,我承认我很笨...
gapkiller 发表于 2010-3-15 22:40 http://www.autoitx.com/images/common/back.gif


    ............................好...比我的好 我用的是random

C.L 发表于 2010-3-16 00:39:42

回复 2# gapkiller

我也是经常用笨办法。

yarsye 发表于 2010-5-27 17:17:13

不好意思 我笨的没看懂 能解释下吗?
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)

其实我大概可以明白这个是怎么运行的 但是让我去写 我搞不出来

netegg 发表于 2010-5-28 09:04:55

回复 5# yarsye

七重循环?累了
个人的想法是分两组计算,第一组是1~81,第二组同样,然后从1~9找出1~81的所有组合,再匹配前后两组

yarsye 发表于 2010-5-28 09:39:08

有点复杂 简单点

learn321 发表于 2010-5-28 11:54:45

本帖最后由 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)

3mile 发表于 2010-6-3 22:26:16

#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:29:30

本帖最后由 netegg 于 2010-6-4 02:31 编辑

回复 9# 3mile
时间方面不错,不过不对,5551没有

3mile 发表于 2010-6-4 09:01:17

本帖最后由 3mile 于 2010-6-4 09:04 编辑

回复 10# netegg
第五行定义数组中只用1-10,可定义 Local $array=
可惜算法还是太肉,4组运行非常慢。
更不敢再加入()运算符了,如果使用还要加入5种运算。
穷举法实在太肉。
。。。
暂时没有更好的办法。
召唤达人出现。

kn007 发表于 2010-6-4 09:50:27

关注这种智力题,蛋蛋你自己呢

Joo 发表于 2010-6-4 10:11:57

mark...等下做~~

lpxx 发表于 2010-6-4 10:24:34

智力题除了基础知识的运用,还包括作者的编程思想,通常后者是衡量是否是一个优秀程序员的标准。

kn007 发表于 2010-6-4 10:26:15

同意楼上的,一个代码可以看出一个人态度
页: [1] 2
查看完整版本: 凑凑热闹(计算24)