bayd1602 2023-04-14 20:29 采纳率: 100%
浏览 22
已结题

二分法c语言查询数字

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

#include<stdio.h>
int a[1000000],b[1000000];
int main(){
int m,n,ans=-1,i,mid;
scanf("%d%d",&n,&m);
getchar();
for(i=0;i<n;i++)scanf("%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
但是却不是

  • 写回答

3条回答 默认 最新

  • 滴水不穿石 2023-04-14 23:33
    关注

    写得不好,仅供参考!

    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;
    }
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 10月23日
  • 已采纳回答 10月15日
  • 创建了问题 4月14日

悬赏问题

  • ¥15 Android Navigation: 某XDirections类不能自动生成
  • ¥20 C#上传XML格式数据
  • ¥15 elementui上传结合oss接口断点续传,现在只差停止上传和继续上传,各大精英看下
  • ¥100 单片机hardfaulr
  • ¥20 手机截图相片分辨率降低一半
  • ¥50 求一段sql语句,遇到小难题了,可以50米解决
  • ¥15 速求,对多种商品的购买力优化问题(用遗传算法、枚举法、粒子群算法、模拟退火算法等方法求解)
  • ¥100 速求!商品购买力最优化问题(用遗传算法求解,给出python代码)
  • ¥15 虚拟机检测,可以是封装好的DLL,可付费
  • ¥15 kafka无法正常启动(只启动了一瞬间会然后挂了)