二分法c语言查询数字

输入n个不超过10的九次方的单调不减的(就是后面的数字不小于前面的数字)的非负整数
a1,2,..an,然后进行m.次询问。对于每次询问,给出一个整数 q,要求输出这个数字在序列中第一次出现的编号,如果没有找到的话输出-1。
输入格式
第一行2个整数n和m,表示数字个数和询问次数。
第二行n个整数,表示这些待查询的数字。
第三行m个整数,表示询问这些数字的编号,从1开始编号。
输出格式
输出一行,m个整数,以空格隔开,表示答案。

#include
int a[1000000],b[1000000];
int main(){
int m,n,ans=-1,i,mid;
scanf("%d%d",&n,&m);
getchar();
for(i=0;iscanf("%d",&a[i]);
i=0;
while(m-->=0){
    scanf("%d",&b[i]);i++;
    int l=0,r=n-1;
    while(l<=r){
        int mid=(l+r)/2;
        if(b[i-1]<=a[mid]){
            ans=mid;
            r=mid-1;
        }
        else l=mid+1;
    }
    if(ans!=-1)printf("%d ",ans);
}
 return 0;
    
}

哪里错了
如输入
11 3
1 3 3 3 5 7 9 11 13 15 15
1 3 6应输出1 2 -1
但是却不是

目测你把查找和输入放在一个循环里了,数据还没有输入呢,自然找不到

写得不好,仅供参考!

img

#include<stdio.h>

int *binarySearch(int val, int *a, int n)
{
    int m = n / 2;
    if (n <= 0)
        return NULL;
    if (val == a[m])
        return a + m;
    if (val < a[m])
        return binarySearch(val, a, m);
    else
        return binarySearch(val, a + m + 1, n - m - 1);
}

int main()
{
    int n, m;
    scanf("%d%d", &n, &m);

    int a[n];
    int b[m];
    int c[m];

    for (int i = 0; i < n; i++)
        scanf("%d", &a[i]);

    for (int i = 0; i < m; i++)
        scanf("%d", &b[i]);

    for (int i = 0; i < m; i++)
    {
        int *t = binarySearch(b[i], a, n);
        for (int j = 0; j < n && t; j++)
        {
            if (*t == a[j])
            {
                c[i] =1+ j;
                break;
            }
        }
        if (!t)
            c[i] = -1;
    }

    for (int i = 0; i < m; i++)
    {
        if (i == m - 1)
            printf("%d\n", c[i]);
        else
            printf("%d  ", c[i]);
    }

    return 0;
}


以下是不用二分法查找的写法

#include<stdio.h>
/* 既然数据都是有序递增的了 下面这样反而精简多
   二分法简直就是多取一举 除非数据不能重复 */
int main()
{
    int n, m;
    scanf("%d%d", &n, &m);

    int a[n];
    int b[m];

    for (int i = 0; i < n; i++)
        scanf("%d", &a[i]);

    for (int i = 0; i < m; i++)
        scanf("%d", &b[i]);

    for (int i = 0; i < m; i++)
    {
        int j;
        for (j = 0; j < n; j++)
        {
            if (b[i] == a[j])
            {
                i == m - 1 ? printf("%d\n", j + 1) : printf("%d  ", j + 1);
                break;
            }
        }
        if (j == n)
            i == m - 1 ? printf("%d\n", -1) : printf("%d  ", -1);
    }

    return 0;
}


不知道你这个问题是否已经解决, 如果还没有解决的话:

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^