趣味二分法

趣味游戏:猜数字

前序:历史渊源

不晓得你是否玩过猜数字的游戏?如果玩过,那么你猜对过几回呢?你是怎样猜对的?有什么诀窍吗?
记得当年头几次玩这个游戏的时候,那就是一个胡猜,加上老天也不助我,一次都没有蒙对,想起来很是悲催。所以当时就有一个念头:自己买**肯定中不了!后来在开始学习编程时,有一次课间休息的时候老师让大家来做个游戏,说是猜数字。我当时就有点不淡定了。结果玩了几个回合,大家猜的都不咋的,但是老师那家伙是一猜一个准,我当时就感觉真厉害。于是乎,他就把他自己写的代码给我们看,看完之后,大家都惊呼:原来是这样啊,要是我知道我也能猜对!
那到底是怎样呢?我们来看看。


正文:道出原委

其实,猜数字想要猜对很容易。其核心就是利用二分法的思想。闲言少叙,我还是用一个例子来说明过程吧。

要求:有两个人甲和乙,在1——100这100个数中,由甲随意写一个数(只有甲知道),现在由乙来猜甲写的这个数,并且猜对这个数时猜的次数最少。
分析:对于这个问题,有两种情况。


情况一:想都不用想,随便猜。这样,猜对时所用的次数就是1 <= N <= 100.如果你命好,一次或者两次就猜对了,那么恭喜你,你真的可以去买**了;相反,你就要用好几十次才能猜对。

情况二:利用二分法。过程如下:

实现代码如下:
#include<iostream> #include<cmath> #include<stdlib.h> using namespace std; void prompt(); int CreateNum(); int GuessNum(); bool Comp(int result,int gn); int main() { int result,i,gn; prompt(); result = CreateNum(); for(i = 0;i < 7;i++) { gn = GuessNum(); if(Comp(result,gn)) { cout<<"你猜对了,厉害!"<<endl; break; } else cout<<"不对,请继续猜!"<<endl; } //Comp(result,gn); cout<<"系统所产生的数是:"<<result; return 0; } //...输出游戏的提示信息 void prompt() { cout<<"---------欢迎你来玩猜数字游戏----------"<<endl; } //...系统自动产生从1~100之间的随机数 int CreateNum() { srand( (unsigned) time(NULL)); int result = (rand()%100) +1; //int result = (int)(100*rand()/(RAND_MAX+1.0)); return result; } //...请你输入一个所猜的数 int GuessNum() { int gn; cout<<"请输入您所猜的数:"; cin>>gn; return gn; } //...比较两数是否相等 bool Comp(int result,int gn) { if(result == gn) { cout<<"恭喜你!猜对了,真厉害!"<<endl; return 1; } else if(result > gn) { cout<<"小了,大点!"<<endl; } else cout<<"大了,小点!"<<endl; return 0; } OK,猜数字的游戏就是这样来玩的。如果你有兴趣的话试一下吧!权当放松心情,缓解一下疲劳吧!

结束语
写本文的目的:轻松一刻!