三千里外欲封侯 2023-12-10 10:03 采纳率: 86.4%
浏览 3
已结题

不用内置指数函数,求x的平方根


int mySqrt(int x) 
{
    int left=0;
    int right=x;
    while(right>=left)
    {
        long long mid=(left+right)/2;
        if(mid*mid<=x&&(mid+1)*(mid+1)>x)
        {
            return mid;
        }
        else if(mid*mid<x)
        left=mid+1;
        else if(mid*mid>x)
        right=mid-1;
    }
    return 0;
}

while循环里的条件为啥必须是right>=left,如果我改成>,那么当测试用例x=1的时候,输出的结果是0

  • 写回答

3条回答 默认 最新

  • &春风有信 2023-12-10 10:47
    关注

    在函数 mySqrt 中,使用 right >= left 作为 while 循环的条件是有原因的。这个条件确保了在这个函数中会至少执行一次循环。

    当你将 right >= left 改为 right > left 时,如果输入的 x 为 1,函数会直接返回 0,而这是不正确的结果。

    在使用二分查找算法求解平方根时,需要确保左右两个边界是递增的。如果左边界小于等于右边界,那么在每次循环中,中间值会从左边界到右边界递增,这样就能保证每次循环都会处理一个更大的可能平方根。

    如果改为 right > left,那么在某些情况下,比如 x 为 1 时,中间值可能会变为 0,这会导致返回的结果不正确。

    因此,为了保证函数的正确性,需要使用 right >= left 作为 while 循环的条件。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 12月19日
  • 已采纳回答 12月11日
  • 创建了问题 12月10日

悬赏问题

  • ¥15 Opencv(C++)异常
  • ¥15 VScode上配置C语言环境
  • ¥15 汇编语言没有主程序吗?
  • ¥15 这个函数为什么会爆内存
  • ¥15 无法装系统,grub成了顽固拦路虎
  • ¥15 springboot aop 应用启动异常
  • ¥15 matlab有关债券凸性久期的代码
  • ¥15 lvgl v8.2定时器提前到来
  • ¥15 qtcp 发送数据时偶尔会遇到发送数据失败?用的MSVC编译器(标签-qt|关键词-tcp)
  • ¥15 cam_lidar_calibration报错