| 
 | 
 
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册  
 
x
 
已有一个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[10] = {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[mid]=%d\n",l,r,mid,*(p+mid));//调试 
 
 -         if(x==*(p+mid)){
 
 -             f=1;
 
 -             break;
 
 -         }
 
 -         else if(x>*(p+mid)){
 
 -             l=mid+1;//不是a[mid+1]ora[mid]+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. 
有没有正规的解法呀?我觉得我的方法只是答案对了,代码有问题。
你的程序第三行写错了,l和r是下标的值,你却将数组对后面的值赋值给了r。 
你让该的那一行根本不需要写。直接删掉就可以了。
  
- # include<stdio.h>
 
 - int Bsearch(int *p, int n, int x);     
 
 - int main(void)   
 
 - {
 
 -     int a[10] = {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[mid]=%d\n",l,r,mid,*(p+mid));//调试 
 
 -         if(x==*(p+mid)){
 
 -             f=1;
 
 -             break;
 
 -         }
 
 -         else if(x>*(p+mid)){
 
 -             l=mid+1;//不是a[mid+1]ora[mid]+1;
 
 -         }
 
 -         else{
 
 -             r=mid-1;
 
 -         }
 
 -         //if(*(p+mid)>=10)break; //直接删掉就可以了
 
 -     }
 
 -     if(f==1) return mid;
 
 -     else if(f==0)return -1;
 
 - }
 
  复制代码 
 
 
 |   
 
 
 
 |