10开根号,如何求?

news/2024/11/23 13:01:25/

你好,我是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))

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


http://www.ppmy.cn/news/779746.html

相关文章

lua读xlsx

lua版本&#xff1a;lua5.1 windows 依赖库 luacom.dll (可以从 lua官网下载 LuaDist 自带的luacom) local luacom require("luacom")local M {}function M:readexcel(filename)local excel luacom.CreateObject("Excel.Application")-- excel.Visibl…

Excel 应用07_多次格式刷应用

对于格式刷的使用 平时都是点击一次格式刷图标&#xff0c;然后才开始格式其他单元格。 如果想可以连续多次格式单元格就&#xff0c;需要双击格式刷图标就可以了。

计算机快速访问工作栏在哪,excel快速访问工具栏 将计算器添加到Excel快速访问工具栏的方法...

excel快速访问工具栏 将计算器添加到Excel快速访问工具栏的方法&#xff0c;看到标题你是不是很兴奋&#xff0c;这不就是你想学习的知识吗&#xff1f;当你掌握excel快速访问工具栏这个知识的时候你一定很兴奋&#xff0c;一定不会后悔看了excel快速访问工具栏 将计算器添加到…

再记公式弱爆了!用 ChatGPT 将 Excel 工作效率提高 10 倍

公众号关注 「奇妙的 Linux 世界」 设为「星标」&#xff0c;每天带你玩转 Linux &#xff01; 在未来&#xff0c;精通 Excel 或许不再是简历亮点了。 ChatGPT 自去年 11 月 30 日 OpenAI 重磅推出以来&#xff0c;这款 AI 聊天机器人迅速成为 AI 界的「当红炸子鸡」。 一经发…

关于如何让Excel表中输入的数值自动做乘法运算

不需其他单元格参与 所有输入的数字自动乘以1.5 1 新建excel表格文件 2 右键表名称(sheet1)->查看代码 3 双击sheet1(sheet1) 粘贴以下代码 该代码是A列的所有输入的数字自动乘以1.5 注意当再次编辑时即使不改变值也会再次乘以1.5!!!! 应该和选择的事件有关 修…

没错!在 Excel 中也能对海量数据进行明细钻取啦

今年年初&#xff0c;Kylin 社区发布了 MDX for Kylin&#xff0c;越来越多小伙伴开始在多个场景使用。本文将带领大家看看 MDX for Kylin 如何快速玩转海量数据的明细钻取&#xff01;欢迎大家访问最新用户手册。 一、场景介绍 数据分析师在进行数据分析过程中&#xff0c;观察…

excel格式调整:表格应用中格式刷技法汇总

格式刷很简单&#xff0c;点一下&#xff0c;就可以把格式复制到其他单元格、图形、文字上。但是格式刷的用法又不仅仅这么一点&#xff0c;它还可以实现快速隔行填色、隔行隐藏&#xff0c;实现“无损”合并单元格等。 在excel中&#xff0c;位于开始菜单中左侧的格式刷&#…

老板叫我把几十万条Excel数据录入系统

几十万条Excel数据怎么录入系统呢 时间17:59&#xff0c;又快到下班时间了&#xff0c;小省同学这样想到。突然手机滴滴的响了起来 小省同学心中顿感不妙&#xff0c;料到可能有什么紧急的工作安排&#xff0c;便想置之不理&#xff0c;想着马上下班直接跑路&#xff0c;溜之大…