题目三十五:神奇算式

目录

题目:

分析:

程序:

题目:

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

比如:

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

都符合要求。

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

分析:

四个数字,分两组。

1.一组一个数字,另一组三个数字。

2.一组两个数字,另一组也是两个数字。

3.以上两组的乘积结果仍是由四位不相同的数字组成,且这四个数字与乘数与被乘数相         同。

处理方法:

1.不相同数字:将乘积结果处理成四位单独的数字,再将其放入集合中,观察长度是否是4。

2.运用count计数方法来统计相同数字的个数。

3.为了提升运行速度,以下提供的程序采取了空间换时间的策略。即分布运行处理并储存结果。

程序:

One = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Two = []
Three = []
Four = []
for i in range(1, len(One)):
    for j in One:
        if One[i] != j:
            Two.append(i * 10 + j)
print(Two)
for j in Two:
    for i in range(0, len(One)):
        if One[i] != int(j / 10) and One[i] != int(j % 10):
            Three.append(j * 10 + One[i])
print(Three)

All_list = {}
#三位数字*一位数字的情况
list = []
for i in Three:
    list.clear()
    a = int(i / 100)
    b = int(i % 100 / 10)
    c = int(i % 100 % 10)
    list.append(a)
    list.append(b)
    list.append(c)
    # print(list)
    j = 1
    while j < 10:
        list.append(j)
        # print(list)
        # print(a, type(a), b, type(b), c, type(c), j, type(j))
        if a != j != b != c and len(str(i * j)) == 4:
            a1 = int((i * One[j]) / 1000)
            b1 = int((i * One[j]) % 1000 / 100)
            c1 = int((i * One[j]) % 1000 % 100 / 10)
            d1 = int((i * One[j]) % 1000 % 100 % 10)
            # print(a1,type(a1),b1,type(b1),c1,type(c1),d1,type(d1))
            list1 = [a1, b1, c1, d1]
            '''
            这里的count是用来计算结果中的数字与乘数与被乘数之中相同的数字个数。
            如果采用 if a1 in list:
                        if b1 in list:
                            if c1 in list:
                                if d1 in list:
                                    print('45689')
            作为判断结果中的数字与乘数与被乘数之中相同的数字个数是否为四的结果的话,也可以。
            下面有实例。
            '''
            count = 0
            if a1 in list:
                count += 1
            if b1 in list:
                count += 1
            if c1 in list:
                count += 1
            if d1 in list:
                count += 1
            if len(set(list1)) == 4 and count == 4:
                All_list.setdefault('{}*{}'.format(One[j], i), [])
                All_list['{}*{}'.format(One[j], i)].append(i * One[j])
        j += 1
        list.remove(list[len(list) - 1])
# 两位数字*两位数字的情况
list = []
for i in Two:
    list.clear()
    a = int(i / 10)
    b = int(i % 10)
    list.append(a)
    list.append(b)
    # print(list)
    for j in Two:
        list.clear()
        list = [a,b]
        if i != j:
            c = int(j / 10)
            d = int(j % 10)
            if a != b != c != d:
                list.append(c)
                list.append(d)
            # print(list)
            if len(str(i * j)) == 4:
                a1 = int((i * j) / 1000)
                b1 = int((i * j) % 1000 / 100)
                c1 = int((i * j) % 1000 % 100 / 10)
                d1 = int((i * j) % 1000 % 100 % 10)
                list1 = [a1, b1, c1, d1]
                # print(list1)
                # print(set(list1))
                count = 0
                if a1 in list:
                    count += 1
                if b1 in list:
                    count += 1
                if c1 in list:
                    count += 1
                if d1 in list:
                    count += 1
                # print(count)
                '''
                                if len(set(list1)) == 4:
                                    if a1 in list:
                                        if b1 in list:
                                            if c1 in list:
                                                if d1 in list:
                                                    All_list1.setdefault('{}*{}'.format(j, i), [])
                                                    All_list1['{}*{}'.format(j, i)].append(i * j)
                '''
                if len(set(list1)) == 4 and count == 4:
                    All_list.setdefault('{}*{}'.format(j, i), [])
                    All_list['{}*{}'.format(j, i)].append(i * j)
print(All_list)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值