找回密码
 加入
搜索
查看: 15396|回复: 34

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

 火... [复制链接]
发表于 2013-1-13 19:59:48 | 显示全部楼层 |阅读模式
大家做做,发挥计算机优势!
发表于 2013-1-13 20:41:25 | 显示全部楼层
(8888-888)/8
发表于 2013-1-13 20:52:23 | 显示全部楼层
记得以前有下载过一个算24点的软件,是用的穷举,把四个数和+-*/()进行组合枚举,直到算式成立且结果正确,可以得到很多解,具体算法还真没去认真看
发表于 2013-1-13 20:58:44 | 显示全部楼层
本帖最后由 netegg 于 2013-1-13 21:01 编辑

8+8+888+8+88 = 1000
计算机优势:)
[au3]Local $a[5] = ['+','-','*','/','']
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)= 1000  Then ConsoleWrite($num & ' = 1000'& @CR)
                                                Next
                                        Next
                                Next
                        Next
                Next
        Next
Next[/au3]

评分

参与人数 1金钱 +50 收起 理由
happytc + 50

查看全部评分

发表于 2013-1-13 21:01:47 | 显示全部楼层
本帖最后由 zch11230 于 2013-1-13 21:16 编辑

首先感叹遇到这类问题 为什么人脑算就这么简单,写程序就这么麻烦
本来想写了一下我自己枚举的思路 发表后刷新看到蛋哥都已经给出代码了 用空来循环8的排列 太妙了  我又感叹自己了。
发表于 2013-1-13 21:03:54 | 显示全部楼层
回复 2# my788522
没说带括号呀
发表于 2013-1-13 22:44:00 | 显示全部楼层
必须有加减乘除的
发表于 2013-1-13 23:43:59 | 显示全部楼层
回复 7# gzh888666
无解
 楼主| 发表于 2013-1-14 01:01:55 | 显示全部楼层
回复 8# netegg

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

当然要带括号了,听说这个本是小学三年级的的一道练习题。并且原题意不要用合并的情况,也就不能出现88,888之类的。
发表于 2013-1-14 01:35:03 | 显示全部楼层
回复 9# happytc
要括号的话就不好说了
发表于 2013-1-15 13:42:30 | 显示全部楼层
本帖最后由 netegg 于 2013-1-15 13:55 编辑

[au3]Local $a[12] = ['+', '-', '*', '/', '+(', '-(', '*(', '/(', ')+', ')-', ')*', ')/']
Local $b[3] = ['(', ')', '']
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
[/au3]
带括号

评分

参与人数 1金钱 +50 收起 理由
happytc + 50 嗯,不错!

查看全部评分

发表于 2013-1-15 13:51:22 | 显示全部楼层
回复 11# netegg

15.4亿次循环~~
发表于 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
部分结果
发表于 2013-1-15 14:19:23 | 显示全部楼层
加个条件会快点
If Not StringInStr($num, '(8)') Then
    If Execute($num) = 1000 Then
 楼主| 发表于 2013-1-15 14:24:42 | 显示全部楼层
回复 11# netegg


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

由于au3没有这些经典算法的相关库函数,写起来太长了,浪费时间,就不写了。

评分

参与人数 1金钱 +30 贡献 +2 收起 理由
annybaby + 30 + 2 厉害、佩服,如果有空可以写个经典算法库就更 ...

查看全部评分

您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-5-5 04:42 , Processed in 0.087608 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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