Topic:
小明是个急性子,上小学的时候经常把老师写在黑板上的题目抄错了。
有一次,老师出的题目是:36 x 495 = ?
他却给抄成了:396 x 45 = ?
但结果却很戏剧性,他的答案竟然是对的!!
因为 36 * 495 = 396 * 45 = 17820
类似这样的巧合情况可能还有很多,比如:27 * 594 = 297 * 54
假设 a b c d e 代表1~9不同的5个数字(注意是各不相同的数字,且不含0)
能满足形如: ab * cde = adb * ce 这样的算式一共有多少种呢?
请你利用计算机的优势寻找所有的可能,并回答不同算式的种类数。
满足乘法交换律的算式计为不同的种类,所以答案肯定是个偶数。
Solution_1:
直接暴力解法
将a, b, c, d. e按照0 — 9 全部排列出来
加上筛选条件:
(1)a, b, c, d, e均表示不同数字(不相等)
(2)满足 ab * cde = adb * ce 这样的算式(按照位数乘10的n次方)
满足两项条件的结果res + 1
Code_1:
res = 0
for a in range(1, 10):
for b in range(1, 10):
for c in range(1, 10):
for d in range(1, 10):
for e in range(1, 10):
if a != b and a != c and a != d and a != e and b != c and b != d and b != e and c != d and c != e \
and d != e and (a * 10 + b) * (c * 100 + d * 10 + e) == (a * 100 + d * 10 + b) * (
c * 10 + e):
res += 1
print(res)
Solution_2(全排列):
运用itertools模块进行简化
首先运用permutations所有元素排列出5位数字全排列的所有可能情况
之后如果满足 ab * cde = adb * ce 这样的算式(按照位数乘10的n次方)
就让res += 1
Code_2:
import itertools
res = 0
x = itertools.permutations([i for i in range(1, 10)], 5)
for j in x:
if (j[0] * 10 + j[1]) * (j[2] * 100 + j[3] * 10 +j [4]) == (j[0] * 100 + j[3] * 10 + j[1]) * (10 * j[2] + j[4]):
res += 1
print(res)
Answer:
142