CNT 看到一个帖子分享的淘宝的一道笔试题,猜数字的问题,1-100随机取一个数, 如果猜的数小了,系统提示你猜小了,如果猜大了,系统只会提示你猜错了,并且以后也不会提示你猜小了或猜大了,问能不能以最少的次数猜对,并且次数是多少,还有第一次应该猜几。刚开始学python,就简单把游戏过程写了一下。。。。纯菜鸟。。。。。。。。就当练手了
传完才发现我已经把次数限制在14了。。。不知道有没其他答案。
标签: <无>
1. [文件] guess.py ~ 485B 下载 (19)
07
from
random
import
randint
15
number
=
int
(
raw_input
(
'input the number:'
))
20
if
number<num
and
flag:
21
print
'smaller,please pick a bigger one'
开源中国-程序员在线工具:API文档大全(120+) JS在线编辑演示 二维码 更多»
1楼:
飞晏 发表于 2012-08-21 15:58
回复此评论
我也是刚学了2天python,不过我觉得这个题目和语言貌似无关。考察的是二分算法吧,第一个数字肯定输入50了,我就顺着楼主的代码copy一份,很多基础我还不明白。
07
from
random
import
randint
14
number
=
int
(
raw_input
(
'input the number:'
))
22
if
number<num
and
flag:
测试:
1
feiyan<a href=
"http://my.oschina.net/u/575662"
target=
"_blank"
rel=
"nofollow"
>@FPC</a> :$ python guess.py
2楼:
李师叔 发表于 2012-08-21 16:05
回复此评论
猜大了就输了,猜小了可以继续?那这就不是二分算法了啊
3楼:
yangst 发表于 2012-08-21 20:23
回复此评论
引用来自“飞晏”的评论
我也是刚学了2天python,不过我觉得这个题目和语言貌似无关。考察的是二分算法吧,第一个数字肯定输入50了,我就顺着楼主的代码copy一份,很多基础我还不明白。
07
from
random
import
randint
14
number
=
int
(
raw_input
(
'input the number:'
))
22
if
number<num
and
flag:
测试:
1
feiyan<a href=
"http://my.oschina.net/u/575662"
target=
"_blank"
rel=
"nofollow"
>@FPC</a> :$ python guess.py
不是这样的,如果有一次猜大了,程序就不会提示你是猜大了还是猜小了,只告诉你是猜对了还是猜错了,并且这次以后不论猜大了猜小了都只提示猜错了。。。
4楼:
yangst 发表于 2012-08-21 20:26
回复此评论
引用来自“水月沧澜”的评论
猜大了就输了,猜小了可以继续?那这就不是二分算法了啊
看一下三楼。。可能有些地方没说明白
5楼:
sybn 发表于 2012-08-21 20:28
回复此评论
从11开始,每次加10
也就是11,21,31,41...91,93,95,97,99,100
14次
6楼:
sybn 发表于 2012-08-21 20:30
回复此评论
11,21,31,41...91,94,97,99,100
11,21,31,41...91,94,97,99,98
11,21,31,41...91,94,97,95,96
这样是13次
7楼:
sybn 发表于 2012-08-21 20:32
回复此评论
还可以继续优化,谁顶上继续,步进应该持续减小.我都用的10,是偷懒的办法
8楼:
yangst 发表于 2012-08-21 20:38
回复此评论
引用来自“sybn”的评论
还可以继续优化,谁顶上继续,步进应该持续减小.我都用的10,是偷懒的办法
我用的持续减小的步进 9 22 34 45 55 64 72 79 85 90 94 97 99 100 是14步
9楼:
清流 发表于 2012-08-23 21:07
回复此评论
引用来自“sybn”的评论
11,21,31,41...91,94,97,99,100
11,21,31,41...91,94,97,99,98
11,21,31,41...91,94,97,95,96
这样是13次
若在51错了,便要14次了额
10楼:
清流 发表于 2012-08-23 21:11
回复此评论
引用来自“yangst”的评论
引用来自“sybn”的评论
还可以继续优化,谁顶上继续,步进应该持续减小.我都用的10,是偷懒的办法
我用的持续减小的步进 9 22 34 45 55 64 72 79 85 90 94 97 99 100 是14步
楼主的思考的很到位,是从100开始倒着看的,那么按14次来,从14开始也行,于是第一个数可以猜9-14均可,只要后面把握好就行
11楼:
sybn 发表于 2012-08-24 14:05
回复此评论
那天下班回去的路上想了一下,在数学上这道题简化后就是:1+2+3+4...+n>100 求你的最小值.
于是n=14
12楼:
yodfz 发表于 2012-08-28 09:08
回复此评论
貌似二分?
13楼:
MeMe 发表于 2012-08-28 16:16
回复此评论
如果每个数最多要猜14次的话,步进递减,以下面的数列达到最小值
13,26,38,49,59,68,76,83,89,94,98
平均猜9.46次可以命中一个数
如果每个数不限长的猜的话,暂时不知道是否有最优解,求科普
14楼:
winktj 发表于 2012-08-28 19:40
回复此评论
引用来自“sybn”的评论
11,21,31,41...91,94,97,99,100
11,21,31,41...91,94,97,99,98
11,21,31,41...91,94,97,95,96
这样是13次
哎兄弟我有点不太明白啊,如果是这样的话,假设在61提示猜错了。 那么已经猜了6次了,但是还是需要在51-61之间猜一个数,还需要9次,那就是15次了,求解。。。。
15楼:
yeliuping 发表于 2012-08-29 14:51
回复此评论
x为100分为x段
y=100/x-(100%x==0 and 1 or 0)+x-1 求出x在(0<x<=100)间的y的最小值
然后以100/x开始100/x递增 如果提示“猜错了” 该数进行以1递减,如果在100/x-(100%x==0 and 1 or 0)次还未提示“猜测了”该数以1递增。计算结果x=10或11(最快第1次就猜对,最晚低19次猜对)
不知道是不是这么算的 请赐教
16楼:
mavarick 发表于 2012-09-07 21:36
回复此评论
一个递归问题:
问题可以简化为:
在(start,end)中间去数k,使得当k取大和取小最终走的步数一样。也就是个等概率问题。所以现在可以考虑:
如果k取大了,那么需要走k-start -1次
如果k取小了,那么需要继续在(k+1,end)之间取数。同样的过程
那么最小的取此集合是多少呢?
假设 96,97,98,99,100 五个数,怎么取呢
同样,取2最好,具体不解释。最多需要3次。取最大 3次
那么上一次取的集合是多少个数值呢?
应该是 本次的取的集合 + 最大的取次 + 1
即[92, 93, 94,
95] [,96, 97 ,98 ,99 , 100]
同理
可得:
集合个数 5 9 14 20 27 35 44 54 65 77 90 104
取次 3 4 5 6 7 8 9 10 11 12 13 14
可见,去14次就可以取100个数一样
所以最多14次