happytc 发表于 2013-1-13 19:59:48

四川大学保送生试题:八个8如何加减乘除才能等于1000

大家做做,发挥计算机优势!

my788522 发表于 2013-1-13 20:41:25

(8888-888)/8

kevinch 发表于 2013-1-13 20:52:23

记得以前有下载过一个算24点的软件,是用的穷举,把四个数和+-*/()进行组合枚举,直到算式成立且结果正确,可以得到很多解,具体算法还真没去认真看

netegg 发表于 2013-1-13 20:58:44

本帖最后由 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:01:47

本帖最后由 zch11230 于 2013-1-13 21:16 编辑

首先感叹遇到这类问题 为什么人脑算就这么简单,写程序就这么麻烦
本来想写了一下我自己枚举的思路 发表后刷新看到蛋哥都已经给出代码了 用空来循环8的排列 太妙了我又感叹自己了。

netegg 发表于 2013-1-13 21:03:54

回复 2# my788522
没说带括号呀

gzh888666 发表于 2013-1-13 22:44:00

必须有加减乘除的

netegg 发表于 2013-1-13 23:43:59

回复 7# gzh888666
无解

happytc 发表于 2013-1-14 01:01:55

回复 8# netegg

有很多的解的,如:8+(8+8)*(8*8-(8+8)/8)=1000

当然要带括号了,听说这个本是小学三年级的的一道练习题。并且原题意不要用合并的情况,也就不能出现88,888之类的。

netegg 发表于 2013-1-14 01:35:03

回复 9# happytc
要括号的话就不好说了

netegg 发表于 2013-1-15 13:42:30

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

带括号

annybaby 发表于 2013-1-15 13:51:22

回复 11# netegg

15.4亿次循环~~
{:face (113):}

netegg 发表于 2013-1-15 13:54:13

本帖最后由 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
部分结果

netegg 发表于 2013-1-15 14:19:23

加个条件会快点
If Not StringInStr($num, '(8)') Then
    If Execute($num) = 1000 Then

happytc 发表于 2013-1-15 14:24:42

回复 11# netegg


    我在想的,要想枚举出所有的可能结果,并且去掉逻辑重复。
①用 Polish Notation建立表达式(忽略括号的存在)
②采用组合的方式枚举所有可能的Polish Notation
③计算每一个表达式的值,满足24的就加入到解集中(24种等效形式,相当于8个叶子节点的二叉树有多少种等价排列)
④将所有等价的表达式都合并,只选取一个作为代表(采取变量替换法,计算替换变量后的表达式的值,作为特征值不相同的特征值的个数,就是唯一解的个数。)

由于au3没有这些经典算法的相关库函数,写起来太长了,浪费时间,就不写了。
页: [1] 2 3
查看完整版本: 四川大学保送生试题:八个8如何加减乘除才能等于1000