Problem Description
输入一递增有序查找表,用折半查找法从该查找表中查找值为x的元素在查找表的位置,按顺序输出查找过程中计算出的位置的中间值mid(mid=(low+high)/2)和x所在的位置,没找到输出0。
Input
每组测试数据包含2行,第1行为查找表,元素为整数且数据之间用一个空格间隔,第2行为x值;测试数据有多组,测试数据组间用一个空行间隔,处理到文件结束位置为止。
Output
每组输出数据占2行,第一行为所有的mid值,数据之间用一个空格间隔,第2行是x所在的位置值或0值。
Sample Input
5 13 19 21 37 56 64 75 80 88 92 21 5 13 19 21 37 56 64 75 80 88 92 70
Sample Output
6 3 4 4 6 9 7 8 0
#include <stdio.h> #include <stdlib.h> #define N 500 typedef struct { int r[N],n,m; }JD; void scanf(JD *X){ int i,a; for(i=1;i<N;i++) { scanf("%d",&X->r[i]); if(getchar()=='\n') break; } X->n=i; scanf("%d",&X->m); } void bin(JD x,int num) { int low,high,mid,found,a[N],i; low=1; high=x.n; found=0; while((low<=high)&&(found==0)) { mid=(low+high)/2; a[num]=mid; num++; if(x.m==x.r[mid]) { found=1; break; } else if(x.m>x.r[mid]) low=mid+1; else high=mid-1; } for(i=1;i<num-1;i++) printf("%d ",a[i]); printf("%d\n",a[num-1]); if(found==1) printf("%d\n",mid); else printf("%d",found); } int main(){ JD x; int num; while(1) { num=1; scanf(&x); bin(x,num); if (getchar()=='\n') continue; else break; } return 0; }