| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 685 人关注过本帖
标题:求教一个c程序的问题
只看楼主 加入收藏
summerpopoha
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2006-2-23
收藏
 问题点数:0 回复次数:6 
求教一个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 
2006-02-23 13:24
柳儿
Rank: 6Rank: 6
等 级:贵宾
威 望:25
帖 子:1830
专家分:30
注 册:2004-9-23
收藏
得分:0 
#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,确实是死循环了。

成功会使人骄傲。如果你骄傲自大,你就会停止学习。不学习,人就停止了进步
2006-02-23 13:36
summerpopoha
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2006-2-23
收藏
得分:0 

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


2006-02-23 14:03
柳儿
Rank: 6Rank: 6
等 级:贵宾
威 望:25
帖 子:1830
专家分:30
注 册:2004-9-23
收藏
得分:0 
这个,你拿6个数的数组,自己模拟一下就知道了。顺便模拟一下自己的程序,你就知道死循环在哪了。

成功会使人骄傲。如果你骄傲自大,你就会停止学习。不学习,人就停止了进步
2006-02-23 14:06
shensheng4
Rank: 1
等 级:新手上路
帖 子:80
专家分:0
注 册:2005-8-7
收藏
得分:0 

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


梦想是不可能实现的,正因为如此才值得我们去追寻。 这是我选择的路,即使付出一切,我也毫无怨言。
2006-02-23 16:22
summerpopoha
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2006-2-23
收藏
得分:0 

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


2006-02-23 16:32
amzyb
Rank: 1
等 级:新手上路
帖 子:76
专家分:0
注 册:2005-1-10
收藏
得分:0 

#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;}
}
}

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

2006-02-23 20:07
快速回复:求教一个c程序的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015054 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved