关于用折半查找法找一个数的题,不知道哪里出错了

up___lqw 2019-11-25 09:16:28
程序运行时,最后一种“无此数”一直不显示,运行不出来。不知道哪写错了。
#include <stdio.h>
main()
{
int a[]={1,2,3,5,6,8,10,11,12,15,16,17,19,23,26};
int left=0,right=14,mid,k;
printf("please enter a num:");
scanf ("%d",&k);
mid=(left+right)/2;
while (left<=right)
{
if (k>a[mid])
{
left=mid+1;
mid=(left+right)/2;
}
else if(k<a[mid])
{ right=mid-1;
mid=(left+right)/2;
}
else if(k=a[mid])
{
printf("%d是第%d个元素的值",k,mid);break;
}
else if(left==right)
{ if(k!=a[mid])
printf("无此数"); break;
}
}
}
...全文
90 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
up___lqw 2019-11-25
  • 打赏
  • 举报
回复
引用 6 楼 寻开心 的回复:
其实我说错了 并没有进入死循环

left=right=14, 进入while的时候 k>a[mid] 按照你的逻辑会如何。left=right+1, 而后就直接退出了

最简单的测试,你在while里面写一句, printf("%d %d %d %d\n", left, right, mid, a[mid]); 就能看到执行的顺序以及最终的结果了

学学调适吧, 不会做断点跟踪,就学会输出中间结果检查执行流程

明白了,非常感谢!!
寻开心 2019-11-25
  • 打赏
  • 举报
回复
其实我说错了 并没有进入死循环

left=right=14, 进入while的时候 k>a[mid] 按照你的逻辑会如何。left=right+1, 而后就直接退出了

最简单的测试,你在while里面写一句, printf("%d %d %d %d\n", left, right, mid, a[mid]); 就能看到执行的顺序以及最终的结果了

学学调适吧, 不会做断点跟踪,就学会输出中间结果检查执行流程

up___lqw 2019-11-25
  • 打赏
  • 举报
回复
引用 4 楼 寻开心 的回复:
当k超出范围的时候,你的while循环的最终结果是left=right=0,或者left=right=14
k小于a【0】 while循环的结果就是 left=right=0;而后死循环
k大于a【14】 while循环的结果就是left=right=14;而后死循环

死循环这里明白了,但是还有一点,每次死循环不是应该直接进入最后一种情况,然后无限不断输出“无此数”吗?为什么不是这样?
寻开心 2019-11-25
  • 打赏
  • 举报
回复
当k超出范围的时候,你的while循环的最终结果是left=right=0,或者left=right=14
k小于a【0】 while循环的结果就是 left=right=0;而后死循环
k大于a【14】 while循环的结果就是left=right=14;而后死循环
寻开心 2019-11-25
  • 打赏
  • 举报
回复
你自己已经找到问题啦。
left=right的时候, k>a[mid] 或者 k<a[mid] 都会陷入死循环

自己在while前加入两个判断解决就好
if ( k<a[left] || k>a[right] ) 输出no,结束
up___lqw 2019-11-25
  • 打赏
  • 举报
回复
引用 1 楼 寻开心 的回复:
else if(k=a[mid])

这里是 == 才对

这个改过后还是不对,就是输入超过范围的数字什么都不显示,问题不在==这里
寻开心 2019-11-25
  • 打赏
  • 举报
回复
else if(k=a[mid])

这里是 == 才对

69,370

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧