蓝桥杯 2014——神奇算式

3.标题:神奇算式

由4个不同的数字,组成的一个乘法算式,它们的乘积仍然由这4个数字组成。

比如: 

210 x 6 = 1260
8 x 473 = 3784
27 x 81 = 2187

都符合要求。

如果满足乘法交换律的算式算作同一种情况,那么,包含上边已列出的3种情况,一共有多少种满足要求的算式。

请填写该数字,通过浏览器提交答案,不要填写多余内容(例如:列出所有算式)。

————————————————
这题的题目要求:
1:4个不同的数字
2:由题目知,乘法算式主要有两种情况:第一种,1位数乘3位数
第二种,2位数乘2位数
对于情况一:abcd=abcd这样的形式
1位数的a,取值范围为:0-9
3位数的bcd,取值范围为有: b的取值范围:1-9
c的取值范围:0-9
d的取值范围:0-9
这样bcd组合起来的就能匹配 100-999这个范围的所有三位数
对于情况二:ab
cd这样的形式:
2位数的ab,取值范围有: a的取值范围:1-9
b的取值范围:0-9
同理
2位数的cd,取值范围有: c的取值范围:1-9
d的取值范围:0-9
这样ab或者cd组合起来就能匹配10-99这个范围的所有二位数

且:满足乘法交换律的算式算作同一种情况,那么,
总情况=情况一+(情况二/2) 注:因为2位数*2位数会出现满足乘法交换律的算式,所以要除以2

3:要判断—》由4个不同的数字,组成的一个乘法算式,它们的乘积仍然由这4个数字组成。
可以将转化为字符串再转化为set(),用集合的判等就能判断

万物基于暴力法:

con_13=0
for a in range(2,10): #因为1*三位数是不可能等于一个四位数,所以a=1这种情况不存在
    for b in range(1,10):
        if b==a:
            continue  #当出现相同的两个数字的时候跳过此次循环。
        for c in range(0,10):
            if c==a or c==b:
                continue
            for d in range(0,10):
                if d==a or d==a or d==c:
                    continue
                sr1=str(a)+str(b)+str(c)+str(d) #这里是等号前面的转换为字符串
                sr2=str(a*int(str(b)+str(c)+str(d)))#这里是等号后面的转换为
                if set(sr1)==set(sr2):    #利用set()判断两个是不是同一集合
                    con_13+=1


con_22=0
for a in range(1,10):
    for b in range(0,10):
        if b==a:
            continue
        for c in range(1,10):
            if c==a or c==b:
                continue
            for d in range(0,10):
                if d==a or d==a or d==c:
                    continue
                sr1=str(a)+str(b)+str(c)+str(d)               
                sr2=str(int(str(a)+str(b))*int(str(c)+str(d)))
                if set(sr1)==set(sr2):
                    con_22+=1

print(con_13+con_22//2) #con_13为情况一的,con_22为情况2的
            

                
                
               


版权声明:本文为weixin_43566803原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。