1. 题目描述
每天早上打开电脑, 第一时间都会习惯性地看看今天推荐的资讯文章,时不时会看到类似于小学生难题, 只有%3的人能做对
字眼的文章, 真的有这么难吗?
细心的程序猿/媛会发现, 这无非是编程入门最基本的题目罢了。今天来看看以下这道小学题
吧!
请将4, 5, 6, 7, 9, 19六个数分别填入A-F空白框中, 每个数在每条算式中只能填一次。
满足: A + B - C = D - E - F。
如下图:
2. 示例代码
思路:
- 条件
A+B-C=D-E-F
即A+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种排列的写法。