10开根号,如何求?
你好,我是zhenguo
这是我的第507篇原创
前几天有朋友问我,面试遇到一道题目,看似简单,但是最后没有写好。
这道题目描述简单,就是使用二分法对非负数开根号,并返回。
中午我实现了一版,截止目前测试没有发现问题。
基本实现思路是这样:
先初步确定开根号所在的一个大概区间[a,b]
然后使用二分法,逐次迭代
详细实现
下面我详细介绍下上面两个步骤。
第一步,初步确定开根号所在的一个大概区间[a,b]
其中,a,b都是整数,找到i**2
大于fc
的i
,然后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开根号,如何求?相关推荐
- 【codevs3119】高精度开根号(二分答案)
problem 高精度开根号 输入一个数 求平方根 solution 二分答案,如果mid*mid>原数就去找更小的,反之找更大的. 精度小于二忽略不计? 用到高精加,高精乘,加低精,除低精,比 ...
- 7-6 jmu-Java-01入门-开根号
使用逐步逼近法对给定数值x求开根号. 逐步逼近法说明:从0开始逐步累加步长值. 步长=0.0001,epsilon(误差)=0.0001 循环继续的条件: 平方值<x 且 |x-平方值| > ...
- 【数学】手写开根号(牛顿迭代法 | 二分)
题目链接 [编程题]开根号 题面 在没有任何数学库函数的情况下,求一个数 m 开 n 次方的结果. 输入描述: 每组输入只有1行,包括有一个正实数m和一个正整数n,其中1<=n<=321 ...
- 经典算法-并查集、快速排序、字典序算法、二分搜索、牛顿开方法、求质数(筛选法)、编辑距离、滑动窗口、异或求重、长除法
目录 并查集 快速排序 字典序算法 二分搜索 开根号-牛顿开方法 求质数 编辑距离 滑动窗口 异或求重 长除法 并查集 并查集用于解决相同元素集合动态连接 ...
- 二分和牛顿法实现开根号
二分法: 二分的思想很直观,就不断做折半,但这里注意需要设置一个精度来替代0,由于开根号并不一定保证能够开方取尽.这里取limit = 0.00002. 牛顿法: 设r是f(x) = 0的根,选取x0 ...
- 7-5 jmu-Java-01入门-开根号 (20分)
使用逐步逼近法对给定数值x求开根号. 逐步逼近法说明:从0开始逐步累加步长值. 步长=0.0001,epsilon(误差)=0.0001 循环继续的条件: 平方值<x 且 |x-平方值| > ...
- 开根号的笔算算法图解_机器学习KNN算法之手写数字识别
1.算法简介 手写数字识别是KNN算法一个特别经典的实例,其数据源获取方式有两种,一种是来自MNIST数据集,另一种是从UCI欧文大学机器学习存储库中下载,本文基于后者讲解该例. 基本思想就是利用KN ...
- maya python 开根号_maya python
胡泳滨MayaPython简易教程,如需转载,请标明出处地址: http://huyongbin.blogbus.com/c3363976/ 谢谢配合! MayaPython第一篇 - 介绍 大家好, ...
- 3倍根号x加1分之一c语言,用C语言将一个数开根号后再取倒数的方法
在上学的时候,曾经看过有人写过这样的算法,就是将一个数开根号后再取倒数的算法,我本人也觉得十分巧妙,于是就将它积累了下来,让我们来看看是怎么回事: #include #include float my ...
最新文章
- 电路过孔温度没有我们想象的那么高
- SDUT-2449_数据结构实验之栈与队列十:走迷宫
- 数据查询和业务流分开_数据仓库介绍与实时数仓案例
- Hadoop的学习前奏(二)——Hadoop集群的配置
- All About Lily Chou-Chou
- 5分钟内看懂机器学习和深度学习的区别
- Pimple相关的源码
- HDU 2045 不容易系列之(3)―― LELE的RPG难题(递推)
- [Angularjs]国际化
- Vue使用Axios Ajax封装渲染页面
- java动态删除属性值_JavaBean动态添加删除属性
- 当万物互联触手可及 你准备好了吗?
- 生成式对抗网络论文阅读整理
- 如何用java代码实现隐藏自己的电话号码
- 移动端app 文档交接模版
- 友声条码秤对接软件_友声条码秤调试教程
- 小爱同学音色服务器响应失败,小爱同学获取数据失败怎么回事
- MinGW-w64没有bin文件解决方法
- jpa Specification in 用法
- 计算机六级准考证,99宿舍如何查询英语六级准考证号