有15个数按由大到小顺序存放在一个数组中,输入一个数,要求用折半查找法找出该数是数组中第几个元素的值

2024-05-16 11:07:01
推荐回答(2个)
回答1:

你这个程序 这句话"if(a[14]<=n<=a[0])" 只是限定了 你要输入的数的大小范围,也就是说你这个数 只要出现在 -12~98 的范围之内,他就默认为你这个数可以进的你的第一个if里面。然后在里面 他又找不到你合适的数 就直接else到最后一个分支了。
另外,折半查找法。。。我写了一下你的作业。没运行,应该没问题。

void main()
{
int a[15]={98,64,58,53,51,46,43,38,31,29,25,10,5,-8,-12};
int i,n,mid,high,low;
int temp,flag;
flag = 1;

printf("数组中数据如下: \n");
for(i=0;i<15;i++)
{
printf("%5d",a[i]);
}
printf("\n");
printf("你想要查找的数字为: ");
scanf("%d",&n);
low = 0; high = 15;

while(low<=high)
{
mid = (low+high)/2;
if(a[mid]==n)
{
temp = mid;
flag = 0;

}
else if(a[mid]>n)
{
high = mid - 1;

}else
{
low = mid + 1;

}

}
if(flag == 0)
{
printf("\n");
printf("%d是此数组中第%d个元素的值",n,temp+1);
printf("\n");
}else
{
printf("查无此数据\n");

}

}

回答2:

#include
#define N 15
int main()
{
int a[N]={15,14,13,12,11,10,9,8,7,6,5,4,3,2,1},i,l,h,m,n,f=1;
scanf("%d",&n);
l=0;
h=N-1;
while(l<=h)
{
m=(l+h)/2;
if(n>a[m])
h=m-1;
else if(nl=m+1;
else if(n==a[m])
{
f=0;
printf("%d : %d\n",m+1,n);
break;
}
}
if(f)printf("不存在此数\n");
return 0;
}