• 对于一个整数求解其平方根可以使用“二分法”和“牛顿法”。
  • 所谓“二分法”就是不断地缩小平方根所在的范围,直到收敛到一个数。例如求解数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<int>& nums, int target){if(nums.size() == 0)return -1;int left = 0, right = nums.size() - 1;while(left <= right){// Prevent (left + right) overflowint 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 > rightreturn -1;
}

二分法求解平方根注意点:相关推荐

  1. 二分法求解非负数的平方根

    二分法求解非负数的平方根.快速查找有序数组的某个元素中有广泛的应用. 二分法求解非负数的平方根的C语言程序如下: float SquareBoot(float x,float epsilon) {lo ...

  2. python二分法求解_Python使用二分法求平方根的简单示例

    这篇文章主要为大家详细介绍了Python使用二分法求平方根的简单示例,具有一定的参考价值,可以用来参考一下. 对python这个高级语言感兴趣的小伙伴,下面一起跟随512笔记的小编两巴掌来看看吧! 使 ...

  3. 用python实现二分法求平方根_二分法求平方根(Python实现)

    使用二分法(Bisection Method)求平方根. def sqrtBI(x, epsilon): assert x>0, 'X must be non-nagtive, not ' + ...

  4. 算法编程11:二分法求平方根

    描述 计算并返回 x 的平方根,其中 x 是非负整数. 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去. 示例 示例 1 --------------------------------- ...

  5. note 5 二分法求平方根,素数,回文数

    +二分法求平方根 x = float(raw_input('Enter the number')) low = 0 high = x guess = (low + high ) / 2 if x &l ...

  6. tensorflow随笔-二分法求解一元方程

    tensorflow编程还是比较麻烦~ #!/usr/bin/env python2 # -*- coding: utf-8 -*- """ Created on Mon ...

  7. 二分法求解方程的根java_C语言二分法求解方程根的两种方法

    本文实例为大家分享了C语言二分法求解方程根的具体代码,供大家参考,具体内容如下 对于二分法求根,其实和弦截法思想很像,甚至更简单. 原理:先看如下的图 A,B两个点为跟的一个边界,通过一直缩小跟的边界 ...

  8. python求平方根的代码_Python求解平方根的方法

    本文实例讲述了Python求解平方根的方法.分享给大家供大家参考.具体如下: 主要通过SICP的内容改写而来.基于newton method求解平方根.代码如下: #!/usr/bin/python ...

  9. c语言实现二分法_C语言实现二分法求解方程在区间内的根

    C语言实现二分法求解方程在区间内的根. 设有非线性方程: 其中, 为 上连续函数且设 (不妨设方程在 内仅有一个实根),求上述方程实根的二分法过程,就是将含根区间[a,b]逐步分半,检查函数值符号的变 ...

最新文章

  1. 23. matlab并行计算原理以及parpool函数
  2. php标题 栏目不显示title,DEDECMS专题列表页不显示title的解决方法
  3. Ajax实现--jQuery
  4. android系统语音合成,android 语音合成报错
  5. 软件测试b s环境如何配置,B/S架构测试环境搭建_DB2篇(Win32系统)
  6. 容器编排技术 -- Kubernetes Master-Node通信
  7. 鲲鹏性能优化十板斧(四)——磁盘IO子系统性能调优
  8. 企业微信可以获取用户unionid吗?
  9. linux设备开发详解宋宝华,[Linux设备驱动开发详解(第2版)].宋宝华.pdf
  10. jiffies:内核中的时间观念
  11. 前置++与后置++的不同
  12. MAX() OVER() 函数
  13. 【图像检测】基于AC算法实现图像显著性检测附matlab代码
  14. DRF 自动生成接口文档
  15. 昆明php工作前景,学习php语言有前途吗 昆明计算机学校
  16. geetest php,Laravel 集成 Geetest验证码的方法
  17. CMS(内容管理系统)心得
  18. 视频素材免费下载网站
  19. Google earth engine的python版安装:GEEMAP
  20. 初始计算机软件教案,鼠标office2007,办公软件教案

热门文章

  1. 王者荣耀服务器能不能注销,王者荣耀游戏账号能永久注销吗 永久删除后还能恢复吗...
  2. 罗马音平假字复制_罗马音平假名和片假名大全
  3. 简谈FPGA设计中不同设计方法资源消耗对比
  4. LayUI动态选项卡iframe使用
  5. 数据库系统原理选择题总结
  6. mysql 中字段存放表情符号,Incorrect string value: ‘\xF0\x9F\x8C\xBB‘ for column
  7. 在10亿个数中找出前1000个最大的
  8. 省钱利器 0 成本创业 高佣联盟APP
  9. Linux 之复制文件或目录(copy)
  10. leetcode 大礼包