还记得刚学习完了随机函数,我自己给自己出了一道问题。
输入一个六位数,尝试让计算机找到这个数。
我当时编出的程序大概是这个样子:
#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;
}
那么,这个程序便编写好了。
(新人写的第一篇文章,不喜勿喷,有问题欢迎在评论区或者私信指出)