找回密码
 加入
搜索
查看: 8292|回复: 20

[效率算法] 凑凑热闹(计算24)

 火.. [复制链接]
发表于 2010-3-15 22:09:40 | 显示全部楼层 |阅读模式
本帖最后由 netegg 于 2011-6-18 01:56 编辑

忽然想起一个题目,算借pusofalse的光,问问大家,我自己也没答案
4组0-10,随机从每一组中挑出一个数,算24,这个大家应该都玩过吧,解是有限的,印象中不超过100组,试试看
(不用枚举解法,只要算得出来就行)
给点提示:可以考虑下递归
不好意思,应该是1到10要不就不对了

时间太长了
给个不完整的答案
这么分组有问题,虽然可以解决大部分,但是5551还是没包括
Local $aI[4] = ['+', '-', '*', '/'], $x[400], $n = 0, $y[400]
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 = 0  To  UBound($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
发表于 2010-3-15 22:40:00 | 显示全部楼层
好吧,我承认我很笨...
Dim $C[4]=['+', '-', '*', '/']
$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)

评分

参与人数 2金钱 +40 收起 理由
Joo + 10 很好很强大!
afan + 30

查看全部评分

发表于 2010-3-15 22:57:16 | 显示全部楼层
好吧,我承认我很笨...
gapkiller 发表于 2010-3-15 22:40



    ............................好...比我的好 我用的是random
发表于 2010-3-16 00:39:42 | 显示全部楼层
回复 2# gapkiller

我也是经常用笨办法。
发表于 2010-5-27 17:17:13 | 显示全部楼层
不好意思 我笨的没看懂 能解释下吗?
Dim $C[4]=['+', '-', '*', '/'] ;这个是定义一个数组 包括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)

其实我大概可以明白这个是怎么运行的 但是让我去写 我搞不出来
 楼主| 发表于 2010-5-28 09:04:55 | 显示全部楼层
回复 5# yarsye

七重循环?累了
个人的想法是分两组计算,第一组是1~81,第二组同样,然后从1~9找出1~81的所有组合,再匹配前后两组
发表于 2010-5-28 09:39:08 | 显示全部楼层
有点复杂 简单点
发表于 2010-5-28 11:54:45 | 显示全部楼层
本帖最后由 learn321 于 2010-5-28 19:52 编辑
好吧,我承认我很笨...
gapkiller 发表于 2010-3-15 22:40



    这是巧妙的算法啊!我加了个计数变量,竟然有3708组符合要求的结果!!

不过,我还有个问题,怎样能够过滤掉输出结果中类似于1+2+3*7=24 和2+1+3*7=24 和3*7+1+2=24 和3*7+2+1=24 等实际重复的结果呢?
Dim $C[4]=['+', '-', '*', '/']
$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)
发表于 2010-6-3 22:26:16 | 显示全部楼层
#include <Array.au3>
Dim $begin = TimerInit()
Local $str,$msg1[1]
Local $run[4]=["+","-","*","/"]
Local $array[10]=[1,2,3,4,5,6,7,8,9,10]
$fin=_ArrayCombinations($array,4,",")
;_ArrayDisplay($fin)
For $b=1 To $fin[0]
        $aa=StringSplit($fin[$b],",",2)
        ;_ArrayDisplay($aa)
        For $i=0 To 3                
                For $j=0 To 3
                        For $k=0 To 3
                                $msg=$aa[0]&$run[$k]&$aa[1]&$run[$j]&$aa[2]&$run[$i]&$aa[3]
                                If Execute($msg)=24 Then _ArrayAdd($msg1,$msg&" = 24")                                
                        Next
                Next
        Next        
Next
_ArrayDisplay($msg1,TimerDiff($begin))
 楼主| 发表于 2010-6-4 02:29:30 | 显示全部楼层
本帖最后由 netegg 于 2010-6-4 02:31 编辑

回复 9# 3mile
时间方面不错,不过不对,5551没有
发表于 2010-6-4 09:01:17 | 显示全部楼层
本帖最后由 3mile 于 2010-6-4 09:04 编辑

回复 10# netegg
第五行定义数组中只用1-10,可定义 Local $array[20]=[1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10]
可惜算法还是太肉,4组运行非常慢。
更不敢再加入()运算符了,如果使用还要加入5种运算。
穷举法实在太肉。
。。。
暂时没有更好的办法。
召唤达人出现。
发表于 2010-6-4 09:50:27 | 显示全部楼层
关注这种智力题,蛋蛋你自己呢
发表于 2010-6-4 10:11:57 | 显示全部楼层
mark...等下做~~
发表于 2010-6-4 10:24:34 | 显示全部楼层
智力题除了基础知识的运用,还包括作者的编程思想,通常后者是衡量是否是一个优秀程序员的标准。
发表于 2010-6-4 10:26:15 | 显示全部楼层
同意楼上的,一个代码可以看出一个人态度
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-16 02:19 , Processed in 0.132096 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表