python题目:1-9不重复的填入九宫格(第一列是百位,第二列是十位,第三列是各位),使第一排的三个数组成的百位数加上第二排三个数组成的百位数等于第三排组成的百位数。问:一共有多少种不重复的填法?

思路:构造随机列表来试验,不过由于计算机性能,我不能得到精确的答案。经过试验,一千万个随机可以找到336条,一百万可以找到322条,十万可以找到89条不重复的填法。
2023.9更新,过了一年了我想起来了这个问题,用什么随机数嘛,用列表推导式穷举就行了,只不过结果就是336条,代码放在结尾。

前言

这种用大量随机列表去试验的方法难以得到精确值,不过我水平有限,不会另外的方法,就这样吧


代码

num=0
list=[]
end_list=[]
for i in range(1000000):       #一千万个随机可以找到336条,一百万可以找到322条,十万可以找到89条
    a=random.sample(range(1,10),9)
    if (a[0]+a[3])*100+(a[1]+a[4])*10+a[2]+a[5]==a[6]*100+a[7]*10+a[8]:
        num+=1
        print(num)
        list.append(a)
    else:
        a=[]
#过滤重复的
for j in list:
    if  j not in end_list:
        end_list.append(j)

print(end_list,"\n",len(end_list))

百万级循环的结果示例

在这里插入图片描述
在这里插入图片描述


总结

一千万次的循环和一百万次循环结果只相差十多次,如果换成一亿次可能会更接近精确值。只是此方法算量就有些庞大了,如果能不用随即创造列表,而是精确的填入数据去试,最多要9**9次循环可得到精确值

更新

a = [(a,b,c,d,e,f,g,h,i) for a in [1,2,3,4,5,6,7,8,9,] for b in [1,2,3,4,5,6,7,8,9,] for c in [1,2,3,4,5,6,7,8,9,] for d in [1,2,3,4,5,6,7,8,9,] for e in [1,2,3,4,5,6,7,8,9,] for f in [1,2,3,4,5,6,7,8,9,] for g in [1,2,3,4,5,6,7,8,9,] for h in [1,2,3,4,5,6,7,8,9,] for i in [1,2,3,4,5,6,7,8,9,]  if (a+d)*100+(b+e)*10+c+f==g*100+h*10+i ]

print(a[:10])
print('a的长度'+str(len(a)))

b = []
for i in range(len(a)):
    if len(set(a[i])) == 9 :

        if a[i] not in b:
            b.append(a[i])
print('\n'*3)
print(b[:10])
print('b的长度'+str(len(b)))			#336
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值