众所周知,我国现有的银行卡的密码都是由6位数字组成,这样就有000000-999999,一共是100万种可能。所以,假如你的银行卡丢了,被别人捡到,想通过试3次就解开密码,这是一件概率极其低的事件。
【问题】现在假如你有一张银行卡完全忘记了密码,恰巧有台机器可以回答你提出关于银行卡密码的问题,但只能回答你是或不是,在这样的条件下,你想重新得到银行卡密码,你至少需要问多少个问题?
【知识准备】二分法
也称为折半法,是一种在有序数组中查找某个特定元素的搜索方法。
也许你对上面的这段话还不甚理解,我来举一个例子,
一天你看到你朋友买了一部新手机,好奇价格,但你朋友只告诉你价格在3000到5000元之间,让你猜。
你肯定会先猜4000元,这个数字就把刚才的价格区间,拦腰分开为平均两份,如果朋友告诉你价格低了,
那么你就会猜4500元,这个数字就会将4000-5000的价格区间,又拦腰分开为平均两份,
依此类推,你每猜一个价格,就相当于把价格区间减半,这样不断缩小手机价格所在的价格区间,最终就会得到手机的价格。
这就是我们生活中经常会遇到的二分法的应用场景,除了这些,二分法还会出现在计算机编程,数学计算,研究等各方面。
二分法使用的次数与区间长度的研究:
比如我们要猜数字的结果是2
对于一个长为2的整数区间[1,2],我只需要问一次,这个数比1大么?你就可以确定这个具体数字,
对于一个长为4的整数区间[1,4],我需要询问两次,一次是这个数比2大么?一次是这个数比1大么?
对于一个长为8的整数区间[1,8],我需要询问三次,一次是这个数比4大么?第二次是这个数比2大么?第三次这个数比1大么?
依次类推,我们可以得到对于一个长度为L的整数区间,我们使用二分法的次数n,就满足这样的一个关系
【解答】
思路一:将密码分成6个部分,分别在每一位上用二分法,进行寻找。
因为每一位的数字都是在0~9之间,一共有10 中可能,根据前面的公式,最多只需要猜4次就可以确定该数位上的数字了。
银行卡密码一共有6位数字,所以就需要24次。
思路二:将6位密码看做是一个整体,数字从000000~999999,共100万个数字。
通过计算可知:
根据前面的公式,就可以知道
所以需要20次就可以了。