Chinaunix

标题: 如何用python解这道题 [打印本页]

作者: luoyonghao    时间: 2014-10-15 14:50
标题: 如何用python解这道题
本帖最后由 luoyonghao 于 2014-10-15 16:02 编辑

a-b=c
d/e=f
g+h=i
c*f=i  
这几个字母是1-9 9个数字 9个数字各不相等 用python算出来 要怎么写?
作者: zongg    时间: 2014-10-15 15:33
本帖最后由 zongg 于 2014-10-15 18:16 编辑


我是新手,感觉写的太屌丝了,


楼下才是大神,,
作者: luoyonghao    时间: 2014-10-15 16:02
zongg 发表于 2014-10-15 15:33
a is: 2
b is: 1
c is: 1


哈哈 我也这么写了一次  题目我发错了 9个数字不能相同 所以还要加上a!=b....  求大神用优雅的办法搞定!!!
作者: Hadron74    时间: 2014-10-15 17:04
本帖最后由 Hadron74 于 2015-02-02 17:05 编辑
  1. def func(n):       
  2.         return n[0]-n[1] == n[2] and n[3]/n[4] == n[5] and n[6]+n[7] == n[8] and n[2]*n[5] == n[8]        
  3. def print_num(numbers):
  4.         for i,s in zip(numbers,"abcdefghi"):
  5.                 print "{}\t{}".format(s,i)
  6. import itertools
  7. s=0
  8. for n in itertools.permutations(range(1,10)):
  9.         if func(n):
  10.                 s += 1
  11.                 print "-"*10+"Solution ",s
  12.                 print_num(n)
复制代码

作者: zongg    时间: 2014-10-15 18:25
回复 4# Hadron74


    好厉害,,, 我想了好久也没想出来。
作者: luoyonghao    时间: 2014-10-15 20:07
回复 4# Hadron74


    受教了,多谢
作者: Linux_manne    时间: 2014-10-16 12:00
回复 4# Hadron74


     学习了 看来 要多熟悉下itertools
作者: shvee    时间: 2014-10-21 16:06
学习了,真是没思路
作者: mmjjddqq    时间: 2015-02-02 16:02
  1. def ALL(Selected, Selecting):
  2.     for i in range(len(Selecting)):
  3.         Selected.append(Selecting[i])
  4.         Next = Selecting[:i]+Selecting[i+1:]
  5.         if Next:
  6.             [i for i in ALL(Selected,Next)]
  7.         else:
  8.             if ((Selected[0]-Selected[1] == Selected[2]) and (Selected[3]/Selected[4]==Selected[5] and Selected[3]%Selected[4]==0) and (Selected[6]+Selected[7] == Selected[8]) and (Selected[2]*Selected[5] == Selected[8])):
  9.                 print "%s "*9 % tuple([chr(65+i)+"="+str(Selected[i]) for i in range(len(Selected))])
  10.             yield Selected
  11.         Selected.pop()
  12. [i for i in ALL([],range(1,10))]
复制代码
嗯我随手写了一下……话说为啥不用递归……N!总比N^N好吧-,-
作者: Hadron74    时间: 2015-02-02 17:34
本帖最后由 Hadron74 于 2015-02-02 18:53 编辑

回复 9# mmjjddqq

貌似你的程序里还是用了递归的。要重新发明轮子么,不用Python的库,当然可以产生全排列。
  1. def ALL(n,k):
  2.     if (k==len(n)-1 and n[0]-n[1] == n[2] and n[3]/n[4] == n[5] and n[6]+n[7] == n[8] and n[2]*n[5] == n[8]):
  3.         print "%s "*9 % tuple(n)
  4.         return
  5.     for i in range(k,len(n)):
  6.         n[k],n[i] = n[i],n[k]
  7.         ALL(n,k+1)
  8.         n[k],n[i] = n[i],n[k]
  9. ALL(list(range(1,10)),0)
复制代码

作者: mitmax    时间: 2015-02-06 16:53
提示: 作者被禁止或删除 内容自动屏蔽
作者: substr函数    时间: 2015-07-05 20:39
本帖最后由 substr函数 于 2015-07-05 20:40 编辑

作为一个轻量级的存在
我也这么写了

  1. a, b, c, d, e, f, g, h, i =  (9, 5, 4, 6, 3, 2, 1, 7, 8)
  2. a, b, c, d, e, f, g, h, i =  (9, 5, 4, 6, 3, 2, 7, 1, 8)
复制代码
  1. #!/usr/bin/python2
  2. # coding: utf-8
  3. from itertools import permutations as P

  4. def check1(c, d, e, i):
  5.     return d * c == e * i

  6. def check2(a, b, c, g, h, i):
  7.     return a - b == c and g + h == i

  8. nine = set(range(1, 10))
  9. VARS = 'a, b, c, d, e, f, g, h, i = '

  10. for four in P(range(1, 10), 4):
  11.     if check1(*four):
  12.         F, m = divmod(four[-1], four[0])
  13.         if m: continue
  14.         c, d, e, i = four
  15.         for five in P(nine - set(four)):
  16.             if five[2] != F: continue
  17.             a, b, f, g, h = five
  18.             if check2(a, b, c, g, h, i):
  19.                 print VARS, (a, b, c, d, e, f, g, h, i)

复制代码

作者: lichmama    时间: 2015-07-07 14:14
本帖最后由 lichmama 于 2015-07-07 14:18 编辑
  1. 已知条件:[a~i]为[1~9]中的数字,而且各不相等,并且满足以下:
  2. a-b=c  =>  b+c=a
  3. g+h=i  =>  g+h=i
  4. c*f=i  =>  c*f=i
  5. d/e=f  =>  e*f=d


  6. =>推导1:
  7. i和d是合数([4,6,8,9]),但是[a~i]之中没有2个3或者2个2,所以:
  8. [i,d] = [6,8]
  9. [c,e,f] = [2,3,4] *约数因子
  10. [b,g,h,a] = [1,5,7,9]

  11. =>推导2:
  12. f与c或者e相乘都能得到一个偶数,所以:
  13. f = 2
  14. [c,e] = [3,4]
  15. [i,d] = [6,8]
  16. [b,g,h] = [1,5,7] *看i的取值范围知道g+h=1+5/7
  17. a=9

  18. =>推导3:
  19. f=2
  20. a=9
  21. b=5 *b在[1,5,7]只能选择5,剩下g+h=8一切可解
  22. i=8
  23. d=6
  24. c=4
  25. e=3
  26. [g,h] = [1,7]
复制代码

作者: substr函数    时间: 2015-07-07 14:33
回复 13# lichmama

大神     
这几个推导用python推导出来 要怎么写?

作者: lichmama    时间: 2015-07-07 15:12
回复 14# substr函数


    容我想想
作者: substr函数    时间: 2015-07-24 11:09
回复 15# lichmama
大神您好,非常感谢! 真心想学!~麻烦大神了

   




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2