1. 程式人生 > >產生不同隨機數,輸入資料用折半查詢判斷資料是否存在。

產生不同隨機數,輸入資料用折半查詢判斷資料是否存在。

隨機產生一組互不相同的兩位整數,然後通過鍵盤輸入一個整數,利用折半查詢法,查詢該整數是否存在。

以為很簡單的小程式,產生隨機數時遇到了大問題,多次相同的隨機數產生,另外還要進行排序,折半查詢的前提就是有序數列。

產生隨機數用到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;