1. 题目描述

每天早上打开电脑, 第一时间都会习惯性地看看今天推荐的资讯文章,时不时会看到类似于小学生难题, 只有%3的人能做对字眼的文章, 真的有这么难吗?

细心的程序猿/媛会发现, 这无非是编程入门最基本的题目罢了。今天来看看以下这道小学题吧!

请将4, 5, 6, 7, 9, 19六个数分别填入A-F空白框中, 每个数在每条算式中只能填一次。
满足: A + B - C = D - E - F。

如下图:

小学题目

2. 示例代码

思路:

  • 条件A+B-C=D-E-FA+B+E+F=D+C
  • 等号两边相加为A+B+C+D+E+F = 4+5+6+7+9+19 = 50
  • 即A+B+E+F=D+C=25, 所以D的值为6或19, C的值为19或6
  • 相加或相减, 两个加数或两个减数之间是等位的, 比如1+3可以写成3+1, 9-3-2可以写成9-2-3
  • 则满足条件A+B-C=D-E-F的写法可以通过排列算法遍历得到结果
  • 由上面的条件, 通过数学中的排列组合里的公式, 得知结果的种数等于[A, B, E, F]的排列种数 A(4, 4) 与[C, D]的排列种数 A(2, 2) 的乘积, 即A(4, 4) * A(2, 2) = 24 * 2 = 48,即满足条件的排列的写法有48种。

Talk is cheap, show me the code!!!

itertools_demo.py内容如下:

# coding: utf-8

import itertools


def permutation(arr, n):
    """ 排列算法 """
    return list(itertools.permutations(arr, n))


def combination(arr, n):
    """ 组合算法 """
    return list(itertools.combinations(arr, n))


def go():
    """ 
        请将4, 5, 6, 7, 9, 19六个数分别填入A-F空白框中, 每个数在每条算式中只能填一次。
        满足: A + B - C = D - E - F

    """
    arr = [4, 5, 6, 7, 9, 19]
    all_list = permutation(arr, 6)
    count = 0
    for one_list in all_list:
        if one_list[0] + one_list[1] - one_list[2] == \
            one_list[3] - one_list[4] - one_list[5]:
            # print "%s + %s - %s = %s - %s - %s" % tuple(i for i in one_list)
            # print('{0[0]} + {0[1]} - {0[2]} = {0[3]} - {0[4]} - {0[5]}'.format(one_list))
            print('{0[0]:>2} + {0[1]:>2} - {0[2]:>2} = {0[3]:>2} - {0[4]:>2} - {0[5]:>2}'.format(one_list))
            count += 1
    print "共有%s种排列的写法。" % count

if __name__ == "__main__":
    go()

运行结果如下:

$ python itertools_demo.py 
 4 +  5 -  6 = 19 -  7 -  9
 4 +  5 -  6 = 19 -  9 -  7
 4 +  5 - 19 =  6 -  7 -  9
 4 +  5 - 19 =  6 -  9 -  7
 4 +  7 -  6 = 19 -  5 -  9
 4 +  7 -  6 = 19 -  9 -  5
 4 +  7 - 19 =  6 -  5 -  9
 4 +  7 - 19 =  6 -  9 -  5
 4 +  9 -  6 = 19 -  5 -  7
 4 +  9 -  6 = 19 -  7 -  5
 4 +  9 - 19 =  6 -  5 -  7
 4 +  9 - 19 =  6 -  7 -  5
 5 +  4 -  6 = 19 -  7 -  9
 5 +  4 -  6 = 19 -  9 -  7
 5 +  4 - 19 =  6 -  7 -  9
 5 +  4 - 19 =  6 -  9 -  7
 5 +  7 -  6 = 19 -  4 -  9
 5 +  7 -  6 = 19 -  9 -  4
 5 +  7 - 19 =  6 -  4 -  9
 5 +  7 - 19 =  6 -  9 -  4
 5 +  9 -  6 = 19 -  4 -  7
 5 +  9 -  6 = 19 -  7 -  4
 5 +  9 - 19 =  6 -  4 -  7
 5 +  9 - 19 =  6 -  7 -  4
 7 +  4 -  6 = 19 -  5 -  9
 7 +  4 -  6 = 19 -  9 -  5
 7 +  4 - 19 =  6 -  5 -  9
 7 +  4 - 19 =  6 -  9 -  5
 7 +  5 -  6 = 19 -  4 -  9
 7 +  5 -  6 = 19 -  9 -  4
 7 +  5 - 19 =  6 -  4 -  9
 7 +  5 - 19 =  6 -  9 -  4
 7 +  9 -  6 = 19 -  4 -  5
 7 +  9 -  6 = 19 -  5 -  4
 7 +  9 - 19 =  6 -  4 -  5
 7 +  9 - 19 =  6 -  5 -  4
 9 +  4 -  6 = 19 -  5 -  7
 9 +  4 -  6 = 19 -  7 -  5
 9 +  4 - 19 =  6 -  5 -  7
 9 +  4 - 19 =  6 -  7 -  5
 9 +  5 -  6 = 19 -  4 -  7
 9 +  5 -  6 = 19 -  7 -  4
 9 +  5 - 19 =  6 -  4 -  7
 9 +  5 - 19 =  6 -  7 -  4
 9 +  7 -  6 = 19 -  4 -  5
 9 +  7 -  6 = 19 -  5 -  4
 9 +  7 - 19 =  6 -  4 -  5
 9 +  7 - 19 =  6 -  5 -  4
共有48种排列的写法。