鱼C论坛

 找回密码
 立即注册
查看: 2697|回复: 2

二分法问题

[复制链接]
发表于 2018-3-22 22:03:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include <stdio.h>
#include <stdlib.h>
void main()
{

        int                num[10]={10,9,8,7,6,5,4,3,2,1};
        int                a,i;//a为待查找的数据
        int                begin=0,mid,end=9;

        printf("enter a:\n");
        scanf("%d",&a);

        while(begin<=end)
        {
                mid =(begin+end)/2;

                if(num[mid]==a)
                {
                        printf("这是第%d个数\n",mid+1);
                        break;
                }
                else if(num[mid]<a)
                {
                        end  =mid -1;
                }
                else
                {
                        begin =mid +1;
                }
        }

        if(begin>end)
        {
                printf("zhao bu dao\n");
        }

}

这里num[mid]<a,那么a不应该Mid的左边吗,为什么不是begin =mid +1;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-3-22 22:24:05 | 显示全部楼层
不能是begin = mid + 1 啊,你假设你输入的是 9 ,开始 mid = 4 ,

那么 9 肯定大于 6 ,如果执行 begin =mid +1 这条语句,那么begin = 5,end = 9

然后加起来mid = 7,那么num[mid]离9就是越来越远了,根本然后也不会找到 9
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-22 22:27:18 | 显示全部楼层
接着刚才的回答,如果执行  end  =mid -1 那么end = 3,下一次mid = 1,刚好num[mid] = 9,也就是找到了

之所以这样,可以这样想,就是你说的,num[mid]<a,那么a不应该Mid的左边,a在mid的左边,说明end有点大了吧,

就是a 的范围应该是begin到mid - 1之间的一个数,所以,把end改为mid - 1没有毛病。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-29 13:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表