2020年广工蛋协移动部第一周考核第一题题解

题目描述

用户输入一个三位数(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.插入网络图片

将图片存在网络服务器上,非常依赖网络。(我现在贴图就是第二种)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值