回 帖 发 新 帖 刷新版面

主题:[讨论]猜数游戏

小明想一个1-n之间的数,小佳每次可以随便才一个数。从第二次猜起,小明告诉小佳本次猜的数和上次猜的数相比哪一个更接近。B表示本次猜测更接近,W表示上次猜测更接近。如果接近程度一样,则回答B,M均可。
    现知道n,但并不知道小明想的是什么数,求要猜多少次,才能保证猜到?[em10]

回复列表 (共3个回复)

沙发

超经典的折半查找法...
头两个数猜n div 2和n div 4,若n div 4更近则猜n div 8,...若n div 2更近则猜(n div 2+n div 4)div 2,.......依次类推直到找到此数.

板凳

我同意楼上的观点。
楼上说的其实就是这样的:
首先把n分成2份:1 -- n1和n1 + 2 -- n(n1 = n DIV 2)。此时应该有一个或几个数不在这2份中的任意一份,我们称它为中间数,每次都猜这个中间数。第一次的中间数是n1 + 1。接着把这2份的每份都像上面分成2份。这时每份都有一个中间数,一共有2个中间数。
先举一个例子:n = 57。
首先把n分成2份:1 -- 28 和 30 -- 57,中间数是29。第一次猜的数就是29。
再把这2份每份分成2份,一共有4份:1 -- 14、16 -- 28、30 -- 43、45 -- 57,这样又出现了2个中间数:15和44。我们假设猜15。如果15更接近,取1 -- 22这段,再取中间数12,然后比较12和15……如果29更接近,取23 -- 57这段,再取中间数41,然后比较29和41……
画图表示:
1_______________________________________________________________57

1____________________________28 [color=FF0000]29[/color] 30___________________________57  
1__________14 [color=FF0000]15[/color] 16__________28    30__________43 [color=FF0000]44[/color] 45_________57
1________[color=FF0000]12[/color]________21 [color=FFFF00]22[/color] 23__________________[color=FF0000]41[/color]_________________57

3 楼

ac...

我来回复

您尚未登录,请登录后再回复。点此登录或注册