当前位置: 代码迷 >> C语言 >> 求教一个c程序的问题
  详细解决方案

求教一个c程序的问题

热度:273   发布时间:2006-02-23 13:24:00.0
求教一个c程序的问题

有15个数按由大到小的顺序存放在一个数组中,输入一个数,用折半法查找该数是数组中第几个元素的值
现在编了下面的程序:

main()
{
int str[15],i,j,p;
for (i=0;i<15;i++)
str[i]=15-i;
scanf("%d",&p);
if(p>15||p<1)
printf("the number is not here!");

for(i=0,j=14;i<=j;)
{if (p<str[(i+j)/2])
i=(i+j)/2;

else if(p>str[(i+j)/2])
j=(i+j)/2;
else
{printf("it is the %d number",1+(i+j)/2);break;}
}
}
15到2每个数字均是正确的,但是输入1,却没有结果,好像进入死循环了
不知何故
大侠请赐教

搜索更多相关的解决方案: str  number  

----------------解决方案--------------------------------------------------------
#include<iostream>
using namespace std;
//input:n个元素按升序排列的数组A[1~n]和元素x
int main(){
int A[14]={1,4,5,7,8,9,10,12,15,22,23,27,32,35},x=22,low=0,high=14,mid;
while(low<=high){
mid=(low+high)/2;
if(x==A[mid]) break;
else if(x<A[mid]) high=mid-1;
else low=mid+1;
}
cout<<mid<<endl;
}

参照看一下,估计你的那个(i+j)/2 总是大于0,所以找不到1,确实是死循环了。
----------------解决方案--------------------------------------------------------

mid=(low+high)/2,若low+high是奇数的话,
会进行取整运算,再进行加一或者减一运算会不会把数字露掉??


----------------解决方案--------------------------------------------------------
这个,你拿6个数的数组,自己模拟一下就知道了。顺便模拟一下自己的程序,你就知道死循环在哪了。

----------------解决方案--------------------------------------------------------

其实可以想一想啊:如果p=1时,那i=13,j=14时,会继续循环,而(i+j)/2的值始终为13。成为死循环。


----------------解决方案--------------------------------------------------------

就是的
现在明白了
咱们改啊?


----------------解决方案--------------------------------------------------------

#include<stdio.h>
main()
{
int str[15],i,j,m,n,p;
for (i=0;i<15;i++)
str[i]=15-i;
scanf("%d",&p);
if(p>15||p<1)
printf("the number is not here!");

for(i=0,j=14;i<=j;)
{ m=i;n=j;
if (p<str[(i+j)/2]){
i=(i+j)/2;
if(m==i) {printf("it is the %d number",2+(i+j)/2);break;}
}
else if(p>str[(i+j)/2]){
j=(i+j)/2;
if(n==i) {printf("it is the %d number",2+(i+j)/2);break;}
}
else {
{printf("it is the %d number",1+(i+j)/2);break;}
}
}

}
因为这里的特殊情况只有这一种,所以找出标识这个特殊情况的特征就可以将它排除掉了。
有什么更好的办法,希望大家不吝赐教!:)


----------------解决方案--------------------------------------------------------
  相关解决方案