[蓝桥杯]神奇算式(Python实现)

题目:

由4个不同的数字,组成的一个乘法算式,它们的乘积仍然由这4个数字组成。
比如:
210 x 6 = 1260
8 x 473 = 3784
27 x 81 = 2187
都符合要求。
如果满足乘法交换律的算式算作同一种情况,那么,包含上边已列出的3种情况,一共有多少种满足要求的算式。
请填写该数字,通过浏览器提交

超烂的暴力解法:

import itertools
result = []
x = list(range(10))
a = list(itertools.permutations(x, 4))
for i in a:
    if i[0] == 0:
        continue
    #分为1*3  2*2  3*1 三种情况
    a = i[0]
    b = i[1]*100+i[2]*10+i[3]
    c = i[0]*10+i[1]
    d = i[2]*10+i[3]
    e = i[0]*100+i[1]*10+i[2]
    f = i[3]
    r1 = list(str(a*b))
    r2 = list(str(c*d))
    r3 = list(str(e*f))
    r1, r2, r3 = list(map(int, r1)), list(map(int, r2)), list(map(int, r3))
    i = list(i)
    i.sort(), r1.sort(), r2.sort(), r3.sort()
    #进行对照,看是否是四个一样的数字
    if r1 == i:
        j = [a, b]
        if j not in result:
            result.append(j)
    elif r2 == i:
        j = [c, d]
        j.sort
        if j not in result:
            result.append(j)
    elif r3 == i:
        j = [e, f]
        if j not in result:
            result.append(j)
#去除满足乘法交换律的结果
res = result[:]
for k in result:
    result = res[:]
    p = len(result)
    for h in range(1, p):
        if k[0] == result[h][1] and k[1] == result[h][0]:
            res.remove(k)

print(len(res))

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值