蓝桥杯每日一题(5):马虎的算式(python)

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

猜你喜欢

转载自blog.csdn.net/weixin_50791900/article/details/112488461