智能手机的密码总共有多少种

iPhone 有10000种密码

iPhone 的密码是一个四位数,从 0000 到 9999 都有可能成为 iPhone 的密码,总的可能性有 10000 种。Android 系统则独具一格,它的“密码”是 3 × 3 的点阵中的一条路径,这条路径最少连接四个点,最多连接九个点。因而,符合要求的路径数最多可以达到 A(9, 4) + A(9, 5) + A(9, 6) + A(9, 7) + A(9, 8) + A(9, 9) = 985 824 种,看上去远远超过了 iPhone 的密码数。不过,这只是 Android 密码数的一个上限。Android 设置密码时有不少限制,这给死理性派的分析带来了巨大的障碍。仔细研究后,死理性派编辑发现——这恐怕是实际生活中最复杂的数学题之一了。

Android 有389 112 种密码

Android 的密码是 3 × 3 点阵中的一条路径,这条路径可以交叉,可以“走日字”,几乎是无所不能(只要不经过重复点),但却有一个例外:路径不允许跳过途中必须要经过的点。例如, 如果从左上角的点连接到右上角的点,中间的那个点会被自动地加进路径里。但麻烦就麻烦在,这个规则本身也有一个值得注意的地方:如果中间的点是之前已经用过的,那么这个点就可以被跳过去了。

/gkimage/e8/kt/3e/e8kt3e.png

我们不妨把点阵中的九个点分别用数字 1 到 9 编号。按照上述规则,4136、4192 都是不合法的,但 24136、654192 则都是可行的。死理性派这下苦恼了,似乎五花八门的组合数学模型在这里都派不上用场。怎么办呢?别急,我们还有强大的计算机帮忙。下面,有请编辑最爱的数学软件 Mathematica 登场。


首先,让我们生成所有 985 824 种没有限制的排列组合:


再记下不能直接连接的点对:

invalidSegments=[(1,3),(3,1),(4,6),(6,4),(7,9),(9,7),(1,7),(7,1),(2,8),(8,2),(3,9),(9,3),(1,9),(9,1),(3,7),(7,3)]</span>
由此生成的不合法规则:

def judge(j):
	for i in range(len(invalidSegments)):
		if str(j).find(''.join(map(str,invalidSegments[i]))) > -1:
			return 1
	return 0
	
		
#a=open('data.log','wb')
for count in range(4,5):
	for i in itertools.permutations(range(1,10),count):
		str_pass=''.join(str(i)[1:len(str(i))-1].split(', '))
		if judge(str_pass)==0:
			num += 1
			#a.write(str_pass+'----->'+str(num))
			#a.write("\t")
			print str_pass,'----->',num
#a.close()

这样,我们就得到了一个准确的数字。


但是,为何统计出来的数字和别人的不一样呢?抓狂

(包含 4、5、6、7、8、9 个点的合法路径数分别为 1624、7152、26016、72912、140704、140704

参见http://www.guokr.com/article/49408/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值