ZZULIOJ1152: 二分搜尋
阿新 • • 發佈:2018-11-25
1152: 二分搜尋
題目描述
在有序序列中查詢某一元素x。
輸入
首先輸入一個正整數n(n<=100000),表示該序列有n個整數,然後按從小到大的順序輸入n個整數;
接著是一個正整數m,表示有m次查詢;
最後是m個整數,表示m個要查詢的整數x。
輸出
對於每一次查詢,有一行輸出。若序列中存在要查詢的元素x,則輸出元素x在序列中的序號(序號從0開始);若序列中不存在要查詢的元素x,則輸出"Not found!"。
樣例輸入
5
1 3 5 7 9
11
-1
1
2
3
4
5
6
7
8
9
10
樣例輸出
Not found!
0
Not found!
1
Not found!
2
Not found!
3
Not found!
4
Not found!
普通做法,提交錯誤
#include<stdio.h>
int main()
{
int n,m,i,x,j,a[100000],flag=0;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
scanf("%d",&m);
for(i=0;i<m;i++)
{
flag=0;
scanf("%d",&x);
for(j=0;j<n;j++)
{
if(x==a[j])
{
printf("%d\n",j);
flag=1;
break;
}
}
if(flag==0)
printf("Not found!\n");
}
return 0;
}
二分方法
#include<stdio.h>
int erfen(int a[],int x,int l,int h)
{
int m;
if (l>h)//大於最大值 直接not found
return -2;
else
{
m=(l+h)/2;//二分搜尋
if(x==a[m])
return m;//返回 序號
else if(x<a[m])//呼叫本身,遞迴
return erfen(a,x,l,m-1);
else
return erfen(a,x,m+1,h);
}
}
int main()
{
int x,p,i,t,n,a[100000];
scanf("%d",&t);
for(i=0;i<t;i++)
scanf("%d",&a[i]);
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&x);
p=erfen(a,x,0,t-1);
if(p==-2)
printf("Not found!\n");
else
printf("%d\n",p);
}
return 0;
}