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

#include"math.h"
main()
{static int i,j,m,a[15]={1,4,9,13,21,34,55,89,144,233,377,570,671,703,812};
scanf("%d",&m);
for(j=0;j<15;j++)
printf("%4d",a[j]);
printf("\n");
i=7;
while(fabs(i-7)<8)
{if(m<a[7])
{if(a[i]-m==0)
{printf("it is at (%d)\n",i+1);break;}i--;}
else if(m>a[7])
{if(a[i]-m==0)
{printf("it is at (%d)\n",i+1);break;}i++;}
else
printf("8\n");
}
if(fabs(i-7)-8==0)
printf("There is not\n");
}

求解释, 谢谢了

比如给一个4的数,程序第一步从数组中取出排在中间数的数(i=7),即 第8个数89.
用89和4比较。如果大于89就往后循环查找,即查找89后的{144,233,377,570,671,703,812},
如果小于89就往前查找,即查找89前的]{1,4,9,13,21,34,55},不管往前还是往后最大循环次数都是7,所以while循环结束条件是(fabs(i-7)<8),即最大执行7次。
其实这个程序就第一步查找是二分法。不算严格的二分。严格二分应该之后都是像第一次查找那样从中间开始取个值出来比较然后决定下一步的循环方向。
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-11-27
输入89的时候好象有问题,无限循环了。。。应该在printf("8\n");后面加给break;
第2个回答  2011-11-01
#include
void main()
{
int a[16],i,t,j;
printf("please input 15 numbers :\n");
for(j=1;j<16;j++)
scanf("%d",&a[j]);
printf("\n");
for(j=1;j<16;j++)
for(i=j+1;i<16;i++)
if (a[j]<a[i])
{
t=a[j];
a[j]=a[i];
a[i]=t;
}
puts("Please input the number to be found");
scanf("%d",&t);
putchar('\n');
i=1;
j=15;
//i,j表示在在数组a的第i个到第j个元素的范围内查找t
while (i<j)//i==j表明t只有可能是数组a的第i个元素
{
if (t<=a[(i+j)/2]) j=(i+j)/2;//此时t在第i个到第(i+j)/2个元素的范围内
else i=(i+j)/2+1;//此时t在第(i+j)/2+1个到第j个元素的范围内
}
if (a[i]!=t) puts("No such element!");//没找到
else printf("%d is element %d of the array.\n",t,i);//找到了
}

有15个数按小到大的顺序存放在一个数组中,输入一个数,要求用折半查找法...
比如给一个4的数,程序第一步从数组中取出排在中间数的数(i=7),即第8个数89.用89和4比较。如果大于89就往后循环查找,即查找89后的{144,233,377,570,671,703,812},如果小于89就往前查找,即查找89前的]{1,4,9,13,21,34,55},不管往前还是往后最大循环次数都是7,所以while循环结束条件是(fabs(i-7)...

用二分法查找(折半查找)java
public class BinarySearch2 {public static void main(String[] args) {\/\/ 生成一个随机数组 int[] array = suiji();\/\/ 对随机数组排序 Arrays.sort(array);System.out.println("产生的随机数组为: " + Arrays.toString(array));System.out.println("要进行查找的值: ");Scanner input...

有15个数按大由小顺序存放在一个数组中,输入一个数,要求用折半查找法...
main(){ int a[15]={x.x.x.x.x.x.x.x.x.x.x.x.x.x.x};\/\/x为输入的十五个数\/\/ int b;printf("enter the number:");scanf("d%,&b");---我下线了

c语言:编写程序,在有序的数列中查找某数,若该数在此数列中则输出它的...
题目:试编写一个程序完成:有15个数按从下到大的顺序存放在一个数组中.输入一个数,要求折半查找法找出该数是数组中第几个元素的值.如果该数不在数组中,输出“不在表。===下面是C代码,其中数组没有设计为录入,而是固定数组=== \/\/输出的序列是从0开始算的,也就是输出的是所在数组的索引...

有15个数按大由小顺序存放在一个数组中,输入一个数,要求用折半查找法...
{cout<<"输入"<<15-m<<"个由大到小数"<<endl; cin>>a[m];} cout<<"输入要查找的数"<<endl; cin>>n; k=n\/2; bool falg=false; for(m=0;m<15;m++) { if(k==a[m]) {cout<<"该数再数组中的位置是:"<<m+1<<endl; falg=true;} if(!falg) cout<<"查无此数"<<endl;} syste...

...大到小的顺序存放在一个数组中,输入一个数,要求用拆半查找法找出该...
\/ z有15个数按由大到小的顺序存放在一个数组中,输入一个数,要求用拆半查找法找出该数是数组中的第几个元素.\/ include"math.h"main(){ static int i,j,m,a[15]={1,4,9,13,21,34,55,89,144,233,377,570,671,703,812};scanf("%d",&m);for(j=14;j>=0;j--)printf("%4d",...

...由大到小排列,输入一个数,运用折半查找法找出该数是第几个数。_百 ...
void main(){ int i,number,top,bott,mid,loca,a[N],flag=1,sign;char c;printf("由大到小输入15个数 :\\n");for(i=0;i<N;i++){ scanf("%d",&a[0]);i++;while(i!=-1&&i<N){ scanf("%d",&a[i]);if(a[i]<a[i-1])i++;else {printf("输入有误,请重新输入:\\...

c语言编程实现“折半查找”的过程。
折半查找是一种高效的查找方法。它可以明显减少比较次数,提高查找效率。但是,折半查找的先决条件是查找表中的数据元素必须有序。参考程序,希望对你有所帮助!include<stdio.h> void main(){ int a[20],x,i,start,end;printf("input 20 numbers:\\n");for(i=0;i<20;i++) scanf("%d",&...

c语言怎么使用折半法
int a[]={89,99,122,220,250,260,400};\/\/如果返回right的值,说明没找到int half_find(int a[], \/\/查找数组 int left, int right, \/\/起始位置 int target) \/\/查找目标{ int pos = right; while (left < right) { int mid = left + (right-left)\/2; if (a[mid] > target...

c语言的折半查找法
你的数组的索引为0-14 所以你可以设两个变量 这两个变量a,b是用来限制你要的数的范围的 一开始a=0 b=14 接着取索引为int((a+b)\/2 )的元素与你输入的比较 如果比输入的小的话那么设a=int(a+b)\/2 )接着继续取索引为int((a+b)\/2 )的元素与你输入的比较 如果比输入的大...

相似回答