题目描述
用户输入一个三位数(100-999),输入一个你想让电脑猜的数后,电脑开始猜一个数,用户输入H(即high),L(即low)告诉电脑是高了还是低了,电脑根据高了低了继续猜,直到猜对为止,猜对时输入Y结束程序。
要求
电脑猜的次数尽可能的少
解题思路
分解题目,逐个击破!
1.用户输入一个三位数
2.电脑开始猜(要电脑生成一个数)
3.用户要输入H,L,Y来指导电脑下一次猜数
4.次数尽可能的少
从第四个次数尽可能的少,我感觉要用二分的方法,而不是电脑生成随机数。我刚开始就是落入了随机数的坑
那我要怎么二分呢?我在草稿纸上模拟了一遍游戏过程。我想到了平时玩的数字炸弹怎么加速游戏进程
假如说是625,100-999,为了快,我肯定说500,直接少一半,然后L,500和999取一半,750,H,那就750和500取一半,625,好,猜对了。
思考上述的游戏进程,不禁发现规律,我们做的操作是在范围内取中间的数(因为这样能减掉一半的数,达到了次数尽可能少的目的),那这个中间的数怎么得到呢?
最大的数+最小的数的和除2 或者 最小的数加上这范围的一半(两者是等价的,不过我先想到的是第二种)
通过意义将最大的数声明为max,最小的数声明为min
那么通过用户输入的H,L就能确定出新范围内max和min,从而进行二分操作,通过不断逼近最终得到该数。
于是我们整体思路就完成了,接下来就要用扎实的编程基础来实现啦~
贴源代码
#include<iostream>
using namespace std;
int main()
{
int max = 999,min = 100;//max,min分别是范围内最大和最小的数
int n;//想让电脑猜的数
char c;//接受Y,H,L
cout<<"你想让电脑猜的数:";
cin>>n;//输入
cout<<"500?";//是500吗?
cin>>c;//接受
if (c == 'Y') return 0;//猜对了直接结束程序
else if (c == 'H') max = 500;
else if (c == 'L') min = 500;
int temp=(max-min)/2+min;//开始缩小范围
cout<<temp<<"?";//是temp吗?
while (1)//要一直猜,直到猜对~~~
{
cin>>c;
if (c == 'Y') return 0;
else if (c == 'H')
{
max = temp;//变化上界
}
else if (c == 'L')
{
min = temp;//变换下界
}
temp=(max-min)/2+min;
cout<<temp<<"?";//同上
}
return 0;
}
下面是运行实例
这道题从构思到实现大概花了半天的时间。
u1s1,markdown贴图也能学到东西
1.插入本地图片,支持相对路径或本地路径
但不灵活不好分享,本地图片的路径更改或丢失都会造成markdown文件调不出图。
2.插入网络图片
将图片存在网络服务器上,非常依赖网络。(我现在贴图就是第二种)