纯粹的热爱 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 向数据表用newid方式插入GUID问题
  • ¥15 multisim电路设计
  • ¥20 用keil,写代码解决两个问题,用库函数
  • ¥50 ID中开关量采样信号通道、以及程序流程的设计
  • ¥15 U-Mamba/nnunetv2固定随机数种子
  • ¥15 C++行情软件的tick数据如何高效的合成K线
  • ¥15 vba使用jmail发送邮件正文里面怎么加图片
  • ¥15 vb6.0如何向数据库中添加自动生成的字段数据。
  • ¥20 在easyX库下编写C语言扑克游戏跑的快,能实现简单的人机对战