找回密码
 立即注册
查看: 8470|回复: 35

[技术交流] 再出个小练习,大家试一试。

[复制链接]
发表于 2016-1-3 11:24:21 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

×
本帖最后由 冬雪雪冬 于 2016-1-4 23:31 编辑

上回列算式的小练习:http://bbs.fishc.com/thread-67616-1-1.html
是将+-*/和=插入0987654321中使等式成立。
这回做个类似的,但更复杂。
给定0123456+-*/
任意排列使最后的结果等于2016。结果例如:6/1+503*4-2 = 2016
1,这7个数字和4个运算符号必须都用到且只能用一次,先后次序不限。
2,优先循序为先乘除后加减。
3,“+‘可以做加号,也可作为正号,“-”可以做减号,也可作为负号。
4,列出所以可能的答案。
5,采用python2或3编写。
6,第一个答对的和优秀的加分奖励。
===========================
我用了12行代码,看看大家有什么更好的办法。
本来给定范围还可以是0123456789+-*/ 但计算太慢,就精简一下。
==============================================
@zoooo 给出了一个很好的答案,大家可以参考一下。

答案的核心就是利用itertools模块,这个模块可以给出字符串的排列和组合结果,这里我们利用排列。
将'0123456+-*/'的所有排列结果用eval尝试是否能组成一个算式,用异常处理排除掉非算式,再计算是否等于2016,如果正确就打印。

  1. import itertools
  2. list1='0123456+-*/'
  3. iter = itertools.permutations(list1)#排列
  4. for i in list(iter):#(i是单个字符的元组)
  5.     zooo=''.join(i)#连接成字符串
  6.     try:
  7.         b=eval(zooo)
  8.         if 2016 == b:
  9.             print(zooo)
  10.     except:
  11.         a=1
复制代码



本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-1-3 13:58:35 | 显示全部楼层

回帖奖励 +3 鱼币

蛮有意思的,尝试中~
小甲鱼最新课程 -> https://ilovefishc.com
回复 顶 踩

使用道具 举报

发表于 2016-1-4 14:14:17 | 显示全部楼层
我的思路是:
1.先把0123456分成5组
2.把+-*/放到中间的四个空中运算,有==2016的便保存
3.改变+-*/符号的位置,然后重复第2步
4.所有可能的运算结束后,改变0123456的顺序,跳转到第1步,继续运行。
直到所有可能的组合都尝试后退出循环

思路大概是这样,不过我刚刚学习python,还不太懂python的语法,没有实现

评分

参与人数 1荣誉 +5 鱼币 +5 收起 理由
冬雪雪冬 + 5 + 5 好的思路就是成功的一半。

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 顶 踩

使用道具 举报

发表于 2016-1-4 14:20:13 | 显示全部楼层

回帖奖励 +3 鱼币

表示刚开始学习的  还有难度
小甲鱼最新课程 -> https://ilovefishc.com
回复 顶 踩

使用道具 举报

 楼主| 发表于 2016-1-4 14:54:40 | 显示全部楼层
zooo 发表于 2016-1-4 14:14
我的思路是:
1.先把0123456分成5组
2.把+-*/放到中间的四个空中运算,有==2016的便保存

看看已有的模块,有没有能够用得上的。
小甲鱼最新课程 -> https://ilovefishc.com
回复 顶 踩

使用道具 举报

 楼主| 发表于 2016-1-4 14:55:54 | 显示全部楼层
卡丁拽拽 发表于 2016-1-4 14:20
表示刚开始学习的  还有难度

尝试一下,不会太难的。
小甲鱼最新课程 -> https://ilovefishc.com
回复 顶 踩

使用道具 举报

发表于 2016-1-4 15:33:14 来自手机 | 显示全部楼层

回帖奖励 +3 鱼币

好难。 有什么可以参考的吗,思路很乱
小甲鱼最新课程 -> https://ilovefishc.com
回复 顶 踩

使用道具 举报

 楼主| 发表于 2016-1-4 15:44:55 | 显示全部楼层
icymintx 发表于 2016-1-4 15:33
好难。 有什么可以参考的吗,思路很乱

我的做法是把0~6和+-*/按排列组合的方法,排列出所有的可能,再一一尝试是否能组成算式,是否等于2016
小甲鱼最新课程 -> https://ilovefishc.com
回复 顶 踩

使用道具 举报

发表于 2016-1-4 20:17:02 | 显示全部楼层

回帖奖励 +3 鱼币

刚开始学习,有难度啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 顶 踩

使用道具 举报

发表于 2016-1-4 21:55:02 | 显示全部楼层

回帖奖励 +3 鱼币

直播??上墙有难度啊~~
小甲鱼最新课程 -> https://ilovefishc.com
回复 顶 踩

使用道具 举报

发表于 2016-1-4 22:04:20 | 显示全部楼层

回帖奖励 +3 鱼币

刚开始学,不过这些题目真的挺好的,引发人思考
小甲鱼最新课程 -> https://ilovefishc.com
回复 顶 踩

使用道具 举报

发表于 2016-1-4 22:55:49 | 显示全部楼层
本帖最后由 zooo 于 2016-1-4 23:54 编辑

一个下午+整个晚上完成了一部分

运行结果(方法二计算得到):
4/1*503-2+6
4/1*503+6-2
4*503/1-2+6
4*503/1+6-2
4*503-2/1+6
4*503-2+6/1
4*503+6/1-2
4*503+6-2/1
503/1*4-2+6
503/1*4+6-2
503*4/1-2+6
503*4/1+6-2
503*4-2/1+6
503*4-2+6/1
503*4+6/1-2
503*4+6-2/1
6/1-2+4*503
6/1-2+503*4
6/1+4*503-2
6/1+503*4-2
6-2/1+4*503
6-2/1+503*4
6-2+4/1*503
6-2+4*503/1
6-2+503/1*4
6-2+503*4/1
6+4/1*503-2
6+4*503/1-2
6+4*503-2/1
6+503/1*4-2
6+503*4/1-2
6+503*4-2/1

有两种方法:
方法一
(理论上只要内存足够大就可以得出结果,我的电脑只有2G内存,所以没算出来 )

  1. import itertools
  2. list1='0123456+-*/'
  3. iter = itertools.permutations(list1)#排列
  4. for i in iter:
  5.     zooo=''.join(i)#连接成字符串
  6.     try:
  7.         b=eval(zooo)
  8.         if 2016 == b:
  9.             print(zooo)
  10.     except:
  11.         a=1
复制代码

方法二(得出了部分结果)

  1. import itertools
  2. list1='0123456'
  3. iter = itertools.permutations(list1)#排列
  4. num = list(iter)
  5. numSize = len(num)
  6. #分组
  7. gNum=[]
  8. for w in range(numSize):
  9.     a=num[w]
  10.     b=list(a[ : 5])
  11.     for i in range(5):
  12.         b[i] = b[i] + a[5]
  13.         temp = b[ : ]
  14.         for j in range(5):
  15.             b[j] = b[j]+a[6]
  16.             gNum.append(b)
  17.             b = temp[ : ]
  18.         b = list(a[ : 5])
  19. list2 = '+-*/'
  20. iter = itertools.permutations(list2)#排列
  21. operate = list(iter)

  22. gSize=len(gNum)#c[1000]=['03', '16', '4', '2', '5']
  23. oSize = len(operate)

  24. for i in range(gSize):
  25.     for j in range(oSize):
  26.         temp = gNum[i][0] + operate[j][0]+gNum[i][1] + operate[j][1]+gNum[i][2] + operate[j][2]+gNum[i][3] + operate[j][3]+gNum[i][4]
  27.         zooo=''.join(temp)#连接成字符串
  28.         try:
  29.             iAns=eval(zooo)
  30.             if 2016 == iAns:
  31.                 print(zooo)
  32.         except:
  33.             x=1
复制代码

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +5 收起 理由
冬雪雪冬 + 5 + 5 + 5 热爱鱼C^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 顶 踩

使用道具 举报

 楼主| 发表于 2016-1-4 23:13:51 | 显示全部楼层
zooo 发表于 2016-1-4 22:55
一个下午+整个晚上完成了一部分

运行结果(方法二计算得到):

思路正确,试试把方法1的05行的list去掉,因为iter就是迭代器,可直接用于for循环就像range一样。不转换成列表就无需大的内存来放置,计算机跑起来就容易的多了。
小甲鱼最新课程 -> https://ilovefishc.com
回复 顶 踩

使用道具 举报

发表于 2016-1-4 23:26:23 | 显示全部楼层
冬雪雪冬 发表于 2016-1-4 23:13
思路正确,试试把方法1的05行的list去掉,因为iter就是迭代器,可直接用于for循环就像range一样。不转换 ...

果然就不会报错了,不愧是版主 ,再次感受了python的强大
小甲鱼最新课程 -> https://ilovefishc.com
回复 顶 踩

使用道具 举报

 楼主| 发表于 2016-1-4 23:37:08 | 显示全部楼层
zooo 发表于 2016-1-4 23:26
果然就不会报错了,不愧是版主 ,再次感受了python的强大

你是第一个给出答案的,予以奖励,如果没有其他更好的答案,这个作为最佳答案还将再次予以奖励。另@VVFock3r  在另一个帖子中也给出了类似的答案,但可惜的是有小的错误。
小甲鱼最新课程 -> https://ilovefishc.com
回复 顶 踩

使用道具 举报

发表于 2016-1-5 09:46:15 | 显示全部楼层
刚刚按照2楼的思路实现了,发现不能得出全部结果
看来之前还是考虑的不全面。想想这题目还是很有趣的,学习到了很多~

小甲鱼最新课程 -> https://ilovefishc.com
回复 顶 踩

使用道具 举报

发表于 2016-1-5 09:52:08 | 显示全部楼层

回帖奖励 +3 鱼币

顶
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-1-5 10:04:24 | 显示全部楼层

把你的答案也放上来吧。
顺便说一下,我看了你的程序,你用python2.7除法是整除会把一些非正确的结果也列出,稍修改一下。
小甲鱼最新课程 -> https://ilovefishc.com
回复 顶 踩

使用道具 举报

发表于 2016-1-5 13:18:27 | 显示全部楼层

回帖奖励 +3 鱼币

支持版主多出题,顶!d=====( ̄▽ ̄*)b
小甲鱼最新课程 -> https://ilovefishc.com
回复 顶 踩

使用道具 举报

发表于 2016-1-5 15:49:37 | 显示全部楼层

回帖奖励 +3 鱼币

正在做~~~
小甲鱼最新课程 -> https://ilovefishc.com
回复 顶 踩

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|鱼C工作室 ( 粤ICP备18085999号-1 )

GMT+8, 2026-11-12 04:48

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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