用Python解小学三年级题

用Python解小学三年级题

用Python解小学三年级题

原题是这样的:

有2,3,4,5,6,7,8七个数字,要把他们放到下面的算式的X中,使之成立
  X X X
    * X
———
X X X X
每个数字至少出现一次。

算式需要八个数字,而现只有七个,故必然有一个数要用到两次。
可以用暴力猜解,找出2-8这七个数字的所有排列组合,然后分别取2-8中一个数字,插入到所有的组合中去,作为出现两次的那个数字。
这时,所有 ABC * D = EFGH 的组合都有了,我们需要做的,就是验证等号,如果等号能成立,就是我们需要的解了。
例如,2-8的其中一个组合为 [3,2,4,5,6,7,8],把2插入第一个位置,变成 [2,3,2,4,5,6,7,8] ,取出算式,就是 232 * 4 = 5678,不是一个解。
再把2插入第二、三…个位置,再验证。再把2换成其它数字,再验证…….

Python实现的代码:

import itertools

results = set()
solutions = itertools.permutations(range(2,9))
for solution in solutions:
    sotmp = list(solution)
    for i in range(2,9):
        for j in range(len(solution)):
            so = sotmp[:]
            so.insert(j, i)
            A = int(”.join([str(s) for s in so[0:3]]))
            B = so[3]
            C = so[4]*1000 + so[5]*100 +so[6]*10 + so[7]
            if A * B == C:
                results.add(‘%d * %d = %d’ % (A,B,C))
print ‘\n’.join(results)


 

算出来的结果为:

547 * 6 = 3282
552 * 7 = 3864
637 * 4 = 2548
748 * 7 = 5236
524 * 7 = 3668
364 * 7 = 2548
546 * 7 = 3822