零的执行人 发表于 2020-3-18 14:45:57

二分法简单题

已有一个10个元素的整形数组a,且按值从小到大有序。
输入一个整数x,然后在数组中查找x,如果找到,输出相应的下标,否则,输出"Not Found"。。
要求编写函数int Bsearch(int *p, int n, int x),找到返回下标,找不到返回-1。
输入样例:
8
输出样例:
Index is 7

裁判测试程序样例:

# include<stdio.h>
int Bsearch(int *p, int n, int x);   
int main(void)   
{
    int a = {1,2,3,4,5,6,7,8,9,10};   
    int x, m;
    scanf("%d",&x);               
    m = Bsearch(a, 10, x);
    if(m >= 0)   
      printf("Index is %d\n",m);
    else
      printf( "Not Found\n");
               
    return 0;
}

/* 请在这里填写答案 */


我的代码答案

int Bsearch(int *p, int n, int x){
    int l=0,r=*(p+n-1);
    int f=0;
    int mid;//必须定义在while循环外,否则无法实现return
    while(l<=r){
      mid=(l+r)/2;
       printf("l=%d,r=%d,mid=%d,a=%d\n",l,r,mid,*(p+mid));//调试
      if(x==*(p+mid)){
            f=1;
            break;
      }
      else if(x>*(p+mid)){
            l=mid+1;//不是aora+1;
      }
      else{
            r=mid-1;
      }
      if(*(p+mid)>=10)break; //改
    }
    if(f==1) return mid;
    else if(f==0)return -1;


}

请问我输出大于10的不是数组的元素输出就一直是    Index is 10
不知道怎么改,就添加了 if(*(p+mid)>=10)break; 语句,通过OJ.
有没有正规的解法呀?我觉得我的方法只是答案对了,代码有问题。

sunrise085 发表于 2020-3-18 16:00:20

你的程序第三行写错了,l和r是下标的值,你却将数组对后面的值赋值给了r。
你让该的那一行根本不需要写。直接删掉就可以了。

# include<stdio.h>
int Bsearch(int *p, int n, int x);   
int main(void)   
{
    int a = {1,2,3,4,5,6,7,8,9,10};
    int x, m;
    scanf("%d",&x);
    m = Bsearch(a, 10, x);
    if(m >= 0)   
      printf("Index is %d\n",m);
    else
      printf( "Not Found\n");
               
    return 0;
}

/* 请在这里填写答案 */

int Bsearch(int *p, int n, int x){
    int l=0,r=n-1;//这里有错,r是右端的下标,你把内容赋值给r
    int f=0;
    int mid;//必须定义在while循环外,否则无法实现return
    while(l<=r){
      mid=(l+r)/2;
       printf("l=%d,r=%d,mid=%d,a=%d\n",l,r,mid,*(p+mid));//调试
      if(x==*(p+mid)){
            f=1;
            break;
      }
      else if(x>*(p+mid)){
            l=mid+1;//不是aora+1;
      }
      else{
            r=mid-1;
      }
      //if(*(p+mid)>=10)break; //直接删掉就可以了
    }
    if(f==1) return mid;
    else if(f==0)return -1;
}

零的执行人 发表于 2020-3-18 17:10:30

sunrise085 发表于 2020-3-18 16:00
你的程序第三行写错了,l和r是下标的值,你却将数组对后面的值赋值给了r。
你让该的那一行根本不需要写。 ...

是呢,当时找了半天
页: [1]
查看完整版本: 二分法简单题