纯粹的热爱 2022-06-07 21:35 采纳率: 60%
浏览 53
已结题

[数据结构]为什么输出不了

题目,给定一个按值有序(升序)的N元整数数组A,采用折半查找法查找关键值k的位置,并给出查找的过程
【输入形式】

第一行:N

第二行:A[0], A[1], ... , A[N-1]

第三行:k
【输出形式】

第一行:k的位置(索引),若不存在则输出'no'

第二行:查找的过程,每一次折半的中间(mid)位置的值,以逗号分隔。例如,1 2 3 4 5的中间位置为3,1 2 3 4的中间位置为2。
【样例输入1】

11
2,5,8,11,15,16,22,24,27,35,50
22
【样例输出1】

6
16,27,22
【样例输入2】

11
2,5,8,11,15,16,22,24,27,35,50
10
【样例输出2】

no
16,8,11
【样例说明】
【评分标准】

必须使用折半法,其他方法不能得分。
#include<stdio.h>
int panduan(int n,int key,int a[]);
int panduan(int n,int key,int a[])
{ int low=0,high=n-1,mid,i=0;
int b[n];
int j=0;
while(low<=high)
{ mid=(low+high)/2;
b[j]=mid;
j++;
if(key==a[mid])i=mid;
else if(key<a[mid])high=mid-1;
else low=mid+1; }
if(a[mid]==key)printf("%d\n",i);
else printf("no\n");
for(i=0;i<j;i++)
{ if(i<j-1)printf("%d,",b[i]);
else printf("%d",b[i]); }
return 0; }
int main(){
int n,i,key;
scanf("%d",&n);

int a[100];
for (i=0;i<n;i++)
{ if(i<n-1)scanf("%d,",&a[i]);
else scanf("%d",&a[i]); }
scanf("%d",&key);
panduan(n,key,a);
return 0; }

  • 写回答

2条回答 默认 最新

  • qzjhjxj 2022-06-09 10:35
    关注

    修改如下,供参考:

    #include<stdio.h>
    int panduan(int n, int key, int a[]);
    int panduan(int n, int key, int a[])
    {
        int low = 0, high = n - 1, mid, i = 0;
        int b[50];  //int b[n];
        int j = 0;
        while (low < high) //(low <= high)
        {
            mid = (low + high) / 2;
            b[j] = a[mid];   //b[j] = mid;
            j++;
            if (key == a[mid]) {
                i = mid;
                break;      //修改
            }
            else if (key < a[mid])
                high = mid - 1;
            else 
                low = mid + 1;
        }
        if (a[mid] == key)
            printf("%d\n", i);
        else 
            printf("no\n");
        for (i = 0; i < j; i++)
        {
            if (i < j - 1)
                printf("%d,", b[i]);
            else 
                printf("%d", b[i]);
        }
        return 0;
    }
    int main() {
        int n, i, key;
        scanf("%d", &n);
    
        int a[100];
        for (i = 0; i < n; i++)
        {
            if (i < n - 1)scanf("%d,", &a[i]);
            else scanf("%d", &a[i]);
        }
        scanf("%d", &key);
        panduan(n, key, a);
        return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 6月19日
  • 已采纳回答 6月11日
  • 修改了问题 6月7日
  • 创建了问题 6月7日

悬赏问题

  • ¥15 微信公众平台自制会员卡可以通过收款码收款码收款进行自动积分吗
  • ¥15 随身WiFi网络灯亮但是没有网络,如何解决?
  • ¥15 gdf格式的脑电数据如何处理matlab
  • ¥20 重新写的代码替换了之后运行hbuliderx就这样了
  • ¥100 监控抖音用户作品更新可以微信公众号提醒
  • ¥15 UE5 如何可以不渲染HDRIBackdrop背景
  • ¥70 2048小游戏毕设项目
  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分
  • ¥15 delphi webbrowser组件网页下拉菜单自动选择问题