随机产生一组互不相同的两位整数,然后通过键盘输入一个整数,利用折半查找法,查找该整数是否存在。
以为很简单的小程序,产生随机数时遇到了大问题,多次相同的随机数产生,另外还要进行排序,折半查找的前提就是有序数列。
产生随机数用到goto,暴力解决。可以通过改变n的值来改变猜中的概率。
#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#include<algorithm>
#define n 20
using namespace std;
int a[n];
void find(int a[],int m)
{
int i,j,mid,high=n,low=0;
sort(a,a+n); //c++快排函数
while(low<=high) //折半查找
{
mid=(high+low)/2;
if(a[mid]>m)
{
high=mid-1;
}
else if(a[mid]<m)
{
low=mid+1;
}
else
{
cout<<"Amazing!该数存在!"<<endl; //若a【mid】正好等于num,输出。
return ;
}
}
if(low>high) //遍历数组后,没有找到
cout<<"Sorry....该数不存在。"<<endl;
}
int main()
{
int num,i,j,k,x;
cout<<"请输入一个数字"<<endl;
while(cin>>num)
{
memset(a,0,sizeof(a)); //清空数组
srand((unsigned)time(NULL)); //产生不同随机数函数
for(i=0;i<n;i++)
{
q: x=rand()%90+10; //产生两位随机数
for(j=0;j<i;j++) //遍历 查重
if(x==a[j]) //若重复
{
goto q; //重新生成随机数
}
a[i]=x;
}
for(i=0;i<n;i++)
for(j=i+1;j<n;j++)//如果产生相同随机数,输出*
if(a[i]==a[j])
cout<<a[i]<<endl;
find(a,num);
}
return 0;
}