Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >10开根号,如何求?

10开根号,如何求?

作者头像
double
发布于 2022-04-06 03:50:58
发布于 2022-04-06 03:50:58
1.2K00
代码可运行
举报
文章被收录于专栏:算法channel算法channel
运行总次数:0
代码可运行

你好,我是zhenguo

这是我的第507篇原创

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

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

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

基本实现思路是这样:

  • 先初步确定开根号所在的一个大概区间[a,b]
  • 然后使用二分法,逐次迭代

详细实现

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

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

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 第一步,确定a,b区间
    fc = math.ceil(x)
    for i in range(fc + 1):
        if i ** 2 >= fc:
            break
    a, b = i - 1, i
    print(f'确定的区间为[{a}-{b}]')

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

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

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

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 第二步,二分法迭代
    while abs(a - b) > precision:
        mid = (a + b) / 2
        if (a ** 2 - x) * (mid ** 2 - x) < 0:
            b = mid
        else:
            a = mid
    return a

完整代码

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import math


def 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:
            break
    a, b = i - 1, i
    print(f'确定的区间为[{a}-{b}]')

    # 第二步,二分法迭代
    i = 1
    while abs(a - b) > precision:
        mid = (a + b) / 2
        if (a ** 2 - x) * (mid ** 2 - x) < 0:
            b = mid
        else:
            a = mid
        print(f'第{i}次迭代后sqrt({x})等于:{a}')
        i += 1
    return a


print(my_sqrt(1.21))

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-04-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员郭震zhenguo 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
经典面试题:如何快速求解根号2?
回到正题,这个肯定不是想问你应该调用哪个函数,而是想问如何自己去实现一个这样的开方函数。
小K算法
2022/06/09
1.1K0
经典面试题:如何快速求解根号2?
#数值分析读书笔记(4)求非线性方程的数值求解
是否同号, 然后即可知根落在左侧还是右侧, 用这个中点来代替掉原来的端点, 然后得到一个新的区间, 如此反复迭代下去之后, 我们会发现区间收敛到接近一个数
Mezereon
2018/09/13
1.1K0
#数值分析读书笔记(4)求非线性方程的数值求解
【每日算法Day 67】经典面试题:手动开根号,你知道几种方法?
为了更加通用,我们这里直接实现 double sqrt(double n) 函数。也就是求出 的精确值,然后取整就行了。
godweiyang
2020/03/24
1.8K0
【每日算法Day 67】经典面试题:手动开根号,你知道几种方法?
一个Sqrt函数引发的血案
好吧,我承认我标题党了,不过既然你来了,就认真看下去吧,保证你有收获。 我们平时经常会有一些数据运算的操作,需要调用sqrt,exp,abs等函数,那么时候你有没有想过:这个些函数系统是如何实现的?就拿最常用的sqrt函数来说吧,系统怎么来实现这个经常调用的函数呢? 虽然有可能你平时没有想过这个问题,不过正所谓是“临阵磨枪,不快也光”,你“眉头一皱,计上心来”,这个不是太简单了嘛,用二分的方法,在一个区间中,每次拿中间数的平方来试验,如果大了,就再试左区间的中间数;如果小了,就再拿右区间的中间数来试。比如
范蠡
2018/04/04
1.2K0
一个Sqrt函数引发的血案
InnoDB B-TREE 索引怎么定位一条记录?
对于 SQL 语句的执行来说,定位 B-TREE 索引中的一条记录,是个举足轻重的能力。
csch
2022/09/05
3290
InnoDB B-TREE 索引怎么定位一条记录?
二分查找总结
二分查找是在每次匹配后,将查找的空间一分为二的算法,二分查找应该是有序的数组进行查找.
Tim在路上
2020/08/04
4830
使用JS 实现二分法查找位置
基本原理是:获取数组的中间值,与要查到的值x进行对比,中间值大于x,则继续对比中间值前半部分数组,依次类推
拿我格子衫来
2022/01/24
1.2K0
使用JS 实现二分法查找位置
机器学习|二分法迭代求零点
01 — 二分法求解 对于区间 [a,b] 上单调连续,且 f(a)· f(b)< 0 的函数 y = f(x),通过不断地把函数 f(x)的零点所在的区间一分为二,使区间的两个端点逐步逼近零点(1
double
2018/04/02
2K0
机器学习|二分法迭代求零点
怎么证明根号2是无理数,我们来推导和计算,还有逼格极高的算法
当我冒出这个想法的时候,其实大部分人的反映都一样1+1开根号就是啊,至于为什么,就是规定呗,当然把根号作为一种符号确实如此,但是离结果还差了很远。
jeanron100
2019/11/24
3.8K0
算法--分治算法
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
奋飛
2019/08/15
5740
数学建模--二分法
在数学建模中,二分法是一种常用的数值方法,用于求解方程的根或函数的极值问题。其基本思想是通过不断将区间一分为二,逐步缩小搜索范围,最终找到满足精度要求的近似解。
用户11315985
2024/10/16
2090
数学建模--二分法
程序员的数学笔记3--迭代法
这里采用一个故事来介绍什么是迭代法,这个故事是讲述一个国王要重赏一个做出巨大贡献的臣子,让臣子提出他想得到的赏赐,这个聪明的臣子说出了他想得到的赏赐--在棋盘上放满麦子,但要求是每个格子的麦子数量都是前一个格子的两倍。国王本以为这个赏赐可以轻而易举的满足,但真正开始放麦子后,发现即便是拿出全国的粮食也无法满足的臣子的这个赏赐。
kbsc13
2019/08/16
7470
每日一面 - sqrt (2)约等于 1.414,如何求sqrt (2)小数点后 10 位
这种算法的原理很简单,我们仅仅是不断用(x,f(x))的切线来逼近方程x^2-a=0的根。根号a实际上就是x^2-a=0的一个正实根,这个函数的导数是2x。也就是说,函数上任一点(x,f(x))处的切线斜率是2x。那么,x-f(x)/(2x)就是一个比x更接近的近似值。代入 f(x)=x^2-a得到x-(x^2-a)/(2x),也就是(x+a/x)/2
干货满满张哈希
2021/04/12
6680
算法浅谈——人人皆知却很多人写不对的二分法
二分法可以说是鼎鼎大名,哪怕是没有学过编程的同学,也许说不上来二分法这个名字,但是对于其中的精髓应该都是有所了解的。不了解的同学也没关系,我一句话就能交代清楚:我们每次将一个集合一分为二,每次舍弃其中一半。
TechFlow-承志
2020/03/05
6350
算法浅谈——人人皆知却很多人写不对的二分法
赠书 | 算力时代,用 Python 来快速解决复杂问题
Python作为一种编程语言,拥有简洁、高效的表达能力。与此同时,Python语言环境中还配备各种软件库,即模块。结合实际问题,选择适当的模块,便可生成简单、快速、正确的程序。
AI科技大本营
2021/05/10
9850
赠书 | 算力时代,用 Python 来快速解决复杂问题
LeetCode69. x 的平方根
 这道题直接一个return Math.sqrt就出来了,但是秉承着学习的心态,尝试着用二分法ac  首先要确定的就是左右区间,左区间是0无疑了,那么右区间是多少呢?一般来说定义区间都是左闭右开,所以右区间定义为x+1,反正定的稍微大一点总没有坏处  然后就是二分的思想,先看中间,中间的值比所希望的值小,就说明在右边,那就把L的值更新为mid+1,不能是mid,不然会产生死循环这点要注意。最后小心数据范围即可
mathor
2018/07/24
8860
LeetCode69. x 的平方根
前端leetcde算法面试套路之双指针
上一 part 刚写完二分和滑窗,他们都属于特殊的双指针方法,所以这一 part 直接汇总一下除了特殊的二分和滑窗外的其他双指针写法
js2030code
2022/11/02
4850
排序算法:插入排序
有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法——插入排序法
谙忆
2021/01/21
2390
二分法还需要练习练习
力扣题目链接:https://leetcode-cn.com/problems/search-insert-position/
代码随想录
2021/10/20
4210
面试手撕算法系列:二分法
这些都是LeetCode上有的题目 手撕无非就是 树、链表、二分、字符串这些常用的数据结构
程序员小猿
2021/01/19
5680
面试手撕算法系列:二分法
相关推荐
经典面试题:如何快速求解根号2?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验