IBM Ponder This上个月的题目比较有趣:我在心里面想一个2到166之间的整数(包括2和166),你的任务是用尽可能少的是非问句(我只能回答是或者否)猜出这个数除1以外的最小约数是多少。
(1) 寻找一种策略使得在最坏情况下猜到答案的询问次数最少。
(2) 寻找一种策略使得在平均情况下猜到答案的期望询问次数最少。
第一个问题很容易回答。虽然2到166之间的整数一共有165个,但它们的最小约数(以后我们说的“最小约数”都是指的不包括1的最小约数)只有38种。因此,事实上你只需要用二分法在38个可能的答案当中找出一个就可以了。由于2^5=32,2^6=64,因此最坏情况下需要6次询问才能保证猜到。
真正困难的是后面一个问题:要想让平均猜测次数尽可能少,我们该从哪里入手呢?