你好,我是zhenguo

这是我的第507篇原创

前几天有朋友问我,面试遇到一道题目,看似简单,但是最后没有写好。

这道题目描述简单,就是使用二分法对非负数开根号,并返回。

中午我实现了一版,截止目前测试没有发现问题。

基本实现思路是这样:

  • 先初步确定开根号所在的一个大概区间[a,b]

  • 然后使用二分法,逐次迭代

详细实现

下面我详细介绍下上面两个步骤。

第一步,初步确定开根号所在的一个大概区间[a,b]

其中,a,b都是整数,找到i**2大于fci,然后break,这样可以确定所得根号值一定位于:[i-1,i]中:

对应的代码块如下所示,其中x是输入的待开根号的数字:

# 第一步,确定a,b区间fc = math.ceil(x)for i in range(fc + 1):if i ** 2 >= fc:breaka, b = i - 1, iprint(f'确定的区间为[{a}-{b}]')

然后,第二步,二分法迭代。既然是迭代,就要确定迭代的终止条件,初始状态,状态转移。

其中,终止条件就是搜索的区间长度变得非常小,达到阈值,默认为0.000000001,终止迭代。

初始状态时,搜索区间为[a,b],也就是上面第一步确定的区间。

状态转移基于二分法策略,既然是二分,也就是每迭代一次,区间长度减半。

那么问题来了,我们需要确定是选择左半区间还是选择右半区间,这个确定标准是关键。不过,在开根号这里,并不难想出来。如果我们选择左半区间,意味着解一定在区间[a,mid]中,这也就意味着:a带入到曲线中与mid带入到曲线中乘积为负值,其中曲线方程为:

# 第二步,二分法迭代while abs(a - b) > precision:mid = (a + b) / 2if (a ** 2 - x) * (mid ** 2 - x) < 0:b = midelse:a = midreturn a

完整代码

将上面的两步综合起来,完整代码如下所示:

import mathdef my_sqrt(x, precision=0.000000001):if x < 0:raise ValueError('x<0')# 第一步,确定a,b区间fc = math.ceil(x)for i in range(fc + 1):if i ** 2 >= fc:breaka, b = i - 1, iprint(f'确定的区间为[{a}-{b}]')# 第二步,二分法迭代i = 1while abs(a - b) > precision:mid = (a + b) / 2if (a ** 2 - x) * (mid ** 2 - x) < 0:b = midelse:a = midprint(f'第{i}次迭代后sqrt({x})等于:{a}')i += 1return aprint(my_sqrt(1.21))

希望这篇文章对你现在或日后有帮助,欢迎点赞或收藏。

10开根号,如何求?相关推荐

  1. 【codevs3119】高精度开根号(二分答案)

    problem 高精度开根号 输入一个数 求平方根 solution 二分答案,如果mid*mid>原数就去找更小的,反之找更大的. 精度小于二忽略不计? 用到高精加,高精乘,加低精,除低精,比 ...

  2. 7-6 jmu-Java-01入门-开根号

    使用逐步逼近法对给定数值x求开根号. 逐步逼近法说明:从0开始逐步累加步长值. 步长=0.0001,epsilon(误差)=0.0001 循环继续的条件: 平方值<x 且 |x-平方值| > ...

  3. 【数学】手写开根号(牛顿迭代法 | 二分)

    题目链接 [编程题]开根号 题面 在没有任何数学库函数的情况下,求一个数 m 开 n 次方的结果. 输入描述: 每组输入只有1行,包括有一个正实数m和一个正整数n,其中1<=n<=321 ...

  4. 经典算法-并查集、快速排序、字典序算法、二分搜索、牛顿开方法、求质数(筛选法)、编辑距离、滑动窗口、异或求重、长除法

    目录 ​​​​​​​​​​​​​​ 并查集 快速排序 字典序算法 二分搜索 开根号-牛顿开方法 求质数 编辑距离 滑动窗口 异或求重 长除法 ​​​​​​​ 并查集 并查集用于解决相同元素集合动态连接 ...

  5. 二分和牛顿法实现开根号

    二分法: 二分的思想很直观,就不断做折半,但这里注意需要设置一个精度来替代0,由于开根号并不一定保证能够开方取尽.这里取limit = 0.00002. 牛顿法: 设r是f(x) = 0的根,选取x0 ...

  6. 7-5 jmu-Java-01入门-开根号 (20分)

    使用逐步逼近法对给定数值x求开根号. 逐步逼近法说明:从0开始逐步累加步长值. 步长=0.0001,epsilon(误差)=0.0001 循环继续的条件: 平方值<x 且 |x-平方值| > ...

  7. 开根号的笔算算法图解_机器学习KNN算法之手写数字识别

    1.算法简介 手写数字识别是KNN算法一个特别经典的实例,其数据源获取方式有两种,一种是来自MNIST数据集,另一种是从UCI欧文大学机器学习存储库中下载,本文基于后者讲解该例. 基本思想就是利用KN ...

  8. maya python 开根号_maya python

    胡泳滨MayaPython简易教程,如需转载,请标明出处地址: http://huyongbin.blogbus.com/c3363976/ 谢谢配合! MayaPython第一篇 - 介绍 大家好, ...

  9. 3倍根号x加1分之一c语言,用C语言将一个数开根号后再取倒数的方法

    在上学的时候,曾经看过有人写过这样的算法,就是将一个数开根号后再取倒数的算法,我本人也觉得十分巧妙,于是就将它积累了下来,让我们来看看是怎么回事: #include #include float my ...

最新文章

  1. 电路过孔温度没有我们想象的那么高
  2. SDUT-2449_数据结构实验之栈与队列十:走迷宫
  3. 数据查询和业务流分开_数据仓库介绍与实时数仓案例
  4. Hadoop的学习前奏(二)——Hadoop集群的配置
  5. All About Lily Chou-Chou
  6. 5分钟内看懂机器学习和深度学习的区别
  7. Pimple相关的源码
  8. HDU 2045 不容易系列之(3)―― LELE的RPG难题(递推)
  9. [Angularjs]国际化
  10. Vue使用Axios Ajax封装渲染页面
  11. java动态删除属性值_JavaBean动态添加删除属性
  12. 当万物互联触手可及 你准备好了吗?
  13. 生成式对抗网络论文阅读整理
  14. 如何用java代码实现隐藏自己的电话号码
  15. 移动端app 文档交接模版
  16. 友声条码秤对接软件_友声条码秤调试教程
  17. 小爱同学音色服务器响应失败,小爱同学获取数据失败怎么回事
  18. MinGW-w64没有bin文件解决方法
  19. jpa Specification in 用法
  20. 计算机六级准考证,99宿舍如何查询英语六级准考证号

热门文章

  1. 世界第一位半机械人出现
  2. cbw与cwd符号扩展的实际意义
  3. 【Paddle打比赛】AIWIN手写字体OCR识别竞赛任务一优化方案
  4. 从mysql导出数据,不导出表结构
  5. 经验分享丨搭建积分兑换商城运营流程
  6. protocol(协议)、delegate(代理)
  7. 彻底搞懂base64加解密原理和隐写技术
  8. 背包问题之01背包、完全背包和多重背包
  9. nlp研究方向的修正
  10. Python例题(08)