编程趣事:猜数字

还记得刚学习完了随机函数,我自己给自己出了一道问题。

输入一个六位数,尝试让计算机找到这个数。

我当时编出的程序大概是这个样子:

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int main()
{
    int n, a;
    cin >> n;
    srand(time(0));
    while(1)
    {
        
        a = rand()%900000 + 100000;
        if (n == a)
        {
             cout<<a;
             break;
        }
    }
}

看起来十分简单对吧?

这段代码的原理也很简单,就是将a随机赋值一个六位数,与n进行比较,如果n与a相等,那么我们就算计算机找到了这个数,然后输出这个数,完成。

那么,时隔多日,我将尝试将这个代码进行优化。

首先先声明一个条件,在我这个问题之中,计算机是可以使用n这个值的,只不过不可以直接输出。什么意思呢?假设计算机可以向用户提问关于n的信息,比如说计算机可以想我们提问n是不是大于或小于某个数(这么说可能很难理解,大家看我接下来的代码应该就可以理解我的意思,最后我会试试写出一个计算机向用户提问,用户回答问题,最后计算机锁定这个数的这么一个程序,大家可以复制代码导入自己的c++编程软件里试一试。我的代码很简单,所以有什么建议请指出,谢谢)只不过我们会直接在代码中赋予这种提问的功能。我一下的代码都是建立在这个条件之上的。

首先,我们先来采用遍历的方法。既然已知这是一个六位数,那么我们可以从六位数中最小数(100000)到最大数(999999)中所有的数遍历一遍,将每个值与n进行比较,最终找到答案。

代码如下

#include <iostream>
using namespace std;
int main()
{
    int n;
    cin >>n;
    for (int i = 100000; i <= 999999; i++)
    {
        if (i == n)
        {
            cout << i;
            break;
        }
    }
    return 0;
}

这样写出来的代码十分简单。不过如果数非常大,比如说1000000多,这种方法可能还没有上一种方法快。所以,可以利用二分查找来加快程序运行速度。代码如下

#include <iostream>
using namespace std;
int  k, l, r, mid;
int main()
{
	cin >> k;
	l = 100000;
	r = 999999;
    while (l <= r) 
	{
		mid = (l + r) / 2;
		if (mid == k)
		{
            cout << mid;
            break;
		}
		else if (mid < k)
		{
			l = mid + 1;
		}
        else
        {
			r = mid - 1;
		}
    }
	return 0;
}

那么,接下来,我们一起来编一个小游戏。这个游戏就建立在上面的这个程序之上,进行一些改动,那么,让我们来试一试吧!

首先,创建一个代码,将头文件等写好,并声明几个变量:l,r,mid,n。

#include <iostream>
using namespace std;
int l, r, mid, n;
int main()
{
    
	return 0;
}

然后,编写一下程序与玩家的交互

#include <iostream>
using namespace std;
int l, r, mid, n;
int main()
{
    cout << "请在心里想一个六位数" << endl;
    cout << "想好了请输入1" << endl;
    cin >> n;
    if (n == 1)
    {
        
    }
	return 0;
}

随后,编写计算机向玩家提问,玩家回答这个过程。其运用到的算法便是二分算法。

#include <iostream>
using namespace std;
int l, r, mid, n;
int main()
{
    cout << "请在心里想一个六位数" << endl;
    cout << "想好了请输入1" << endl;
    cin >> n;
    if (n == 1)
    {
        l = 100000; //左端点
        r = 999999; //右端点
        while (1)
        {
            mid = (l + r) / 2;//寻找当前中点
            cout << "你想的这个数与" << mid << "的关系是:" << endl;
            cout << "1.大于 2.等于 3. 小于" << endl;
            cin >> n;
            if (n == 1)//大于中点
            {
                l = mid + 1; //移动左端点
            }
            else if (n == 2)
            {
                cout << "你想的数是不是" << mid; //输出结果
                break; //跳出循环(千万记得加这个,否则是死循环)
            }
            else if (n == 3)
            {
                r = mid - 1;//移动右端点
            }
        }
        
    }
	return 0;
}

那么,这个程序便编写好了。

(新人写的第一篇文章,不喜勿喷,有问题欢迎在评论区或者私信指出)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值