四川大学保送生试题:八个8如何加减乘除才能等于1000
大家做做,发挥计算机优势! (8888-888)/8 记得以前有下载过一个算24点的软件,是用的穷举,把四个数和+-*/()进行组合枚举,直到算式成立且结果正确,可以得到很多解,具体算法还真没去认真看 本帖最后由 netegg 于 2013-1-13 21:01 编辑8+8+888+8+88 = 1000
计算机优势:)
Local $a = ['+','-','*','/','']
For $i1 = 0 To 4
For $i2 = 0 To 4
For $i3 = 0 To 4
For $i4 = 0 To 4
For $i5 = 0 To 4
For $i6 = 0 To 4
For $i7 = 0 To 4
$num = '8' & $a[$i1] & '8' & $a[$i2] & '8' & $a[$i3] & '8' & $a[$i4] & '8' & $a[$i5] & '8' & $a[$i6] & '8' & $a[$i7] & '8'
;ConsoleWrite(Execute($num) & @cr)
If Execute($num)= 1000Then ConsoleWrite($num & ' = 1000'& @CR)
Next
Next
Next
Next
Next
Next
Next 本帖最后由 zch11230 于 2013-1-13 21:16 编辑
首先感叹遇到这类问题 为什么人脑算就这么简单,写程序就这么麻烦
本来想写了一下我自己枚举的思路 发表后刷新看到蛋哥都已经给出代码了 用空来循环8的排列 太妙了我又感叹自己了。 回复 2# my788522
没说带括号呀 必须有加减乘除的 回复 7# gzh888666
无解 回复 8# netegg
有很多的解的,如:8+(8+8)*(8*8-(8+8)/8)=1000
当然要带括号了,听说这个本是小学三年级的的一道练习题。并且原题意不要用合并的情况,也就不能出现88,888之类的。 回复 9# happytc
要括号的话就不好说了 本帖最后由 netegg 于 2013-1-15 13:55 编辑
Local $a = ['+', '-', '*', '/', '+(', '-(', '*(', '/(', ')+', ')-', ')*', ')/']
Local $b = ['(', ')', '']
For $i1 = 0 To 11
For $i2 = 0 To 11
For $i3 = 0 To 11
For $i4 = 0 To 11
For $i5 = 0 To 11
For $i6 = 0 To 11
For $i7 = 0 To 11
For $i8 = 0 To 2
For $i9 = 0 To 2
$num = $b[$i8] & '8' & $a[$i1] & '8' & $a[$i2] & '8' & $a[$i3] & '8' & $a[$i4] & '8' & $a[$i5] & '8' & $a[$i6] & '8' & $a[$i7] & '8' & $b[$i9]
;ConsoleWrite(Execute($num) & @cr)
If Execute($num) = 1000 Then ConsoleWrite($num & ' = 1000' & @CR)
Next
Next
Next
Next
Next
Next
Next
Next
Next
带括号 回复 11# netegg
15.4亿次循环~~
{:face (113):} 本帖最后由 netegg 于 2013-1-15 14:08 编辑
回复 12# annybaby
怕什么,计算机优势
终值写错了,1亿多次
可能还少了,括号连着出的没考虑8+8*8*(8-8/(8+8)+8) = 1000 162660.535305067
(8+8*(8-8/(8+8)+8)*8) = 1000 382963.213785714
8+8*(8-8/(8+8)+8)*8 = 1000 382963.42202617
(8+8)*8*(8-8/8/8)-8 = 1000 586922.595164911
(8+8)*8*(8-8/(8)/8)-8 = 1000 587048.644188429
(8+8)*8*(8-(8/8)/8)-8 = 1000 588206.431794896
(8+8)*8*(8-(8)/8/8)-8 = 1000 588403.409179787
部分结果 加个条件会快点
If Not StringInStr($num, '(8)') Then
If Execute($num) = 1000 Then 回复 11# netegg
我在想的,要想枚举出所有的可能结果,并且去掉逻辑重复。
①用 Polish Notation建立表达式(忽略括号的存在)
②采用组合的方式枚举所有可能的Polish Notation
③计算每一个表达式的值,满足24的就加入到解集中(24种等效形式,相当于8个叶子节点的二叉树有多少种等价排列)
④将所有等价的表达式都合并,只选取一个作为代表(采取变量替换法,计算替换变量后的表达式的值,作为特征值不相同的特征值的个数,就是唯一解的个数。)
由于au3没有这些经典算法的相关库函数,写起来太长了,浪费时间,就不写了。