第一行,空格隔开两个整数 NN 和 MM。
第二行输入 NN 个整数。
之后的 MM 行,每一行一个整数 XX,表示所需要找到的数。
输出格式
对于每次询问输出一个结果。
样例 1
样例输入
Copy
5 3
1 2 3 3 5
1
3
6
样例输出
Copy
0
2
-1
用基础的C语言,但是一直不能输出-1
#include<stdio.h>
int main(void)
{
int N,M,X[100],a[100],i,j,flag=1;
int middle;
scanf("%d%d",&N,&M);
for(i=0;i<N;i++)
{
scanf("%d",&a[i]);
}
for(j=0;j<M;j++)
{
scanf("%d",&X[j]);
}
for(i=0;i<M;i++)
{
for(j=0;j<N;j++)
{
int left=0,right=N-1;
middle=(left+right)/2;
while(left<right)
{
if(a[middle]==X[j])
{
printf("%d\n",middle);
break;
}
else if(a[middle]>X[j])
{
right=middle-1;
}
else {
left=middle;
}
middle=(left+right)/2;
}
}
if(a[middle]!=X[j])
{
flag=0;
}
if(flag==0) printf("-1");
}
return 0;
}
最先出现的位置,却使用二分法,这有点教条了吧
if(a[middle]==X[j])
{
printf("%d\n",middle);
break;
}
这个判断也是不对啊,你这不是序列最先出现的位置,是二分法最先找到的位置,如果序列是1 3 3 3 5,你搜索3的话,你想得到的是2,还是1呢?
参考:
#include "stdio.h"
int fun(int a[],int n,int *p){
int left,right,mid;
left = 0;
right= n-1;
while(left<=right){
//获取中间位置元素的下标
mid = (left+right)/2;
if(*p>a[mid]){
//往右找
left=mid+1;
}else if(*p<a[mid]){
//往左找
right=mid-1;
}else{
break;
}
};
return mid;
}
void main()
{
int a[10]={1,2,3,4,5,8,10,110,120,1000};
int index = -1;
int num,cnt=0;
printf("请输入你要查找的数据:");
scanf("%d",&num);
index = fun(a,10,&num);
printf("%d的位置是:%d",num,index);
}