博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
二分法求解平方根注意点:
阅读量:3708 次
发布时间:2019-05-21

本文共 1698 字,大约阅读时间需要 5 分钟。


  • 对于一个整数求解其平方根可以使用“二分法”和“牛顿法”。
  • 所谓“二分法”就是不断地缩小平方根所在的范围,直到收敛到一个数。例如求解数k的平方根t,首先设置t的范围为[left, right](其中left和right分别初始化为1, k),然后判断m=(l+k)/2与k的平方根t的关系,如果m比t小,则t的范围为[m+1, right],否则为[left, m-1],然后依次循环,直到left>=right终止。
int mySqrt(int x) {        if(x == 0)        {            return 0;        }        int left  = 1;        int right = x;        int ret = 0;        while(left <= right)        {            int mid = (left + right) / 2;            if(mid == x / mid)            {                return mid;            }            else if(mid > x/mid)            {                 right = mid - 1;            }            else            {                left = mid + 1;                   ret = mid;       //在 left 需要后移前,就要注意 平方根整数部分,相反 right 前移则不需要注意              }        }                return ret;    }
  • 通过观察代码,我们可以发现其中有两处地方值得考虑,对于第一处判断可能很多人潜意识的会写成“mid * mid == k”,而第二处写成“mid * mid > k”,初看,这个貌似的确没有什么问题,但是在运行程序时可能会发现出现死循环现象。(我第一次写代码就出现了这样的问题)

  • 为什么会出现这种情况呢?

    主要是因为在计算机中整型数据(int)是有位数限制的,一般是4个字节(32bits),这就可能出现“mid * mid”溢出的情况,这样在程序执行过程中就可能出现无限循环的情况。

  • 因此,以后在程序设计过程中一定要特别注意不同类型数的位数的限制,避免因为溢出造成的逻辑错误,而且在能够同时使用乘法或者除法(注意考虑除数不能为0)时,尽量使用除法计算。

在做运算时,不仅要避免乘法可能会带来的问题,还需要考虑到加法可能或造成的溢出问题,对于“二分法”算法中求解"mid=left+right"就需要考虑右边可能因为溢出造成的结果错误,因此应该改成"mid=left+(right-left)/2".

二分法标准模板

int binarySearch(vector
& nums, int target){ if(nums.size() == 0) return -1; int left = 0, right = nums.size() - 1; while(left <= right) { // Prevent (left + right) overflow int mid = left + (right - left) / 2; if(nums[mid] == target) { return mid; } else if(nums[mid] < target) { left = mid + 1; } else { right = mid - 1; } } // End Condition: left > right return -1;}

转载地址:http://cuzjn.baihongyu.com/

你可能感兴趣的文章
从头实现Linux字符设备驱动——2万字详解
查看>>
每日一练(三十二)
查看>>
每日一练(三十三)
查看>>
每日一练(三十四)
查看>>
每日一练(三十五)
查看>>
每日一练(三十六)
查看>>
每日一练(三十七)
查看>>
Typedef与Define的区别
查看>>
51单片机—串口通信
查看>>
51单片机—红外遥控
查看>>
C51—模拟IIC总线实现EEPROM存取数据
查看>>
C51—小知识点
查看>>
51单片机—使用PWM对直流电机调速
查看>>
51单片机—LCD1602显示模块
查看>>
头文件的建立
查看>>
STM32—常用的几种伪指令宏
查看>>
STM32—位带操作
查看>>
STM32—时钟树(结合系统时钟函数理解)
查看>>
Keil5中出现中文乱码的解决方法
查看>>
STM32—中断详解(配合按键中断代码,代码亲测)
查看>>