问题描述
给定一个单调递增的整数序列,问某个整数是否在序列中
输入格式
第一行为一个整数n,表示序列中整数的个数;第二行为n(n不超过10000)个整数;第三行为一个整数m(m不超过50000),表示查询的个数;接下来m行每行一个整数k。
输出格式
每个查询的输出占一行,如果k在序列中,输出Yes,否则输出No。
样例输入
5 //数据个数
1 3 4 7 11 //具体数据
3 //查询个数
3
6
9
样例输出
Yes
No
No
思考:先写出二分法的核心代码,设置low、high、mid,传递3个参数,数组、个数、关键字。设置flage判断是否找到,在主程序中直接调用。
该代码存在一定问题,没有达到预期效果,不能等数据输入完成后一次性给出结果,而是输入一个数据,给出一个结果。
注:测试数据时从小到大输入数据。
具体代码
# include <stdio.h>
# define N 1000
void two(int a[],int n,int key)
{
int flag=0;
int low=0,mid;
int high=n-1 ;
while(low<=high)
{
mid=(low+high)/2;
if(a[mid]==key)
{
flag=1;
break;
}
if(a[mid]>key)
high=mid-1;
if(a[mid]<key)
low=mid+1;
}
if(a[mid]==key)
flag=1;
if(flag==1)
printf("ok\n");
else
printf("no\n");
}
int main()
{
int i,b,c,d;
int a[N];
printf("输入数据总数\n");
scanf("%d",&b);
printf("输入数据\n");
for(i=0;i<b;i++){
scanf("%d",&a[i]);
}
printf("输入查询数据总数\n");
scanf("%d",&c);
printf("输入查询数据\n");
for(i=0;i<c;i++){
scanf("%d",&d);
two(a,5,d);
}
return 0;
}