鱼C论坛

 找回密码
 立即注册
查看: 1323|回复: 2

[已解决]二分法简单题

[复制链接]
发表于 2020-3-18 14:45:57 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

裁判测试程序样例:

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

  16. /* 请在这里填写答案 */
复制代码



我的代码答案

  1. int Bsearch(int *p, int n, int x){
  2.     int l=0,r=*(p+n-1);
  3.     int f=0;
  4.     int mid;//必须定义在while循环外,否则无法实现return
  5.     while(l<=r){
  6.         mid=(l+r)/2;
  7.        printf("l=%d,r=%d,mid=%d,a[mid]=%d\n",l,r,mid,*(p+mid));//调试
  8.         if(x==*(p+mid)){
  9.             f=1;
  10.             break;
  11.         }
  12.         else if(x>*(p+mid)){
  13.             l=mid+1;//不是a[mid+1]ora[mid]+1;
  14.         }
  15.         else{
  16.             r=mid-1;
  17.         }
  18.         if(*(p+mid)>=10)break; //改
  19.     }
  20.     if(f==1) return mid;
  21.     else if(f==0)return -1;


  22. }
复制代码


请问我输出大于10的不是数组的元素输出就一直是    Index is 10
不知道怎么改,就添加了 if(*(p+mid)>=10)break; 语句,通过OJ.
有没有正规的解法呀?我觉得我的方法只是答案对了,代码有问题。
最佳答案
2020-3-18 16:00:20
你的程序第三行写错了,l和r是下标的值,你却将数组对后面的值赋值给了r。
你让该的那一行根本不需要写。直接删掉就可以了。

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

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

  17. int Bsearch(int *p, int n, int x){
  18.     int l=0,r=n-1;//这里有错,r是右端的下标,你把内容赋值给r
  19.     int f=0;
  20.     int mid;//必须定义在while循环外,否则无法实现return
  21.     while(l<=r){
  22.         mid=(l+r)/2;
  23.        printf("l=%d,r=%d,mid=%d,a[mid]=%d\n",l,r,mid,*(p+mid));//调试
  24.         if(x==*(p+mid)){
  25.             f=1;
  26.             break;
  27.         }
  28.         else if(x>*(p+mid)){
  29.             l=mid+1;//不是a[mid+1]ora[mid]+1;
  30.         }
  31.         else{
  32.             r=mid-1;
  33.         }
  34.         //if(*(p+mid)>=10)break; //直接删掉就可以了
  35.     }
  36.     if(f==1) return mid;
  37.     else if(f==0)return -1;
  38. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-3-18 16:00:20 | 显示全部楼层    本楼为最佳答案   
你的程序第三行写错了,l和r是下标的值,你却将数组对后面的值赋值给了r。
你让该的那一行根本不需要写。直接删掉就可以了。

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

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

  17. int Bsearch(int *p, int n, int x){
  18.     int l=0,r=n-1;//这里有错,r是右端的下标,你把内容赋值给r
  19.     int f=0;
  20.     int mid;//必须定义在while循环外,否则无法实现return
  21.     while(l<=r){
  22.         mid=(l+r)/2;
  23.        printf("l=%d,r=%d,mid=%d,a[mid]=%d\n",l,r,mid,*(p+mid));//调试
  24.         if(x==*(p+mid)){
  25.             f=1;
  26.             break;
  27.         }
  28.         else if(x>*(p+mid)){
  29.             l=mid+1;//不是a[mid+1]ora[mid]+1;
  30.         }
  31.         else{
  32.             r=mid-1;
  33.         }
  34.         //if(*(p+mid)>=10)break; //直接删掉就可以了
  35.     }
  36.     if(f==1) return mid;
  37.     else if(f==0)return -1;
  38. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

是呢,当时找了半天
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-5 08:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表