基于Python的二分法求平方根

一个程序最核心的就是思想,换个词就是说是“思路”。解决这个问题的思路就是二分法逼近:
对于一个大于0的数,它的平方根是实数,而对于一个小于0的数开平方之后是一个纯虚数,其模等于该数的绝对值开平方。而在正数的这一边对于大于1 的数常用的二分法求平方根的思路是——

 输入:x输出:√x步骤:①low = 0;high = x;②guess = (low + high) / 2③如果guess² == x,则输出guess,程序结束;④如果guess² < x,则low = guess,继续执行步骤②⑤如果guess² > x,则high = guess,继续执行步骤②

基于以上思路,我们可以选择用条件语句来完成上述③④⑤步:

                 if guess ** 2 < x:low = guesselse:high = guessguess = (low + high) / 2

对于guess,由于奇数的存在使得它必须允许小数的存在,因此我们这里为求精确取float型,因而为了方便我们将x的数据类型也定义为浮点型:

x = float(input("请输入一个需要开方的数,且保留2位小数:\n x = "))

这样我们就能便于比较guess²和x的大小关系,常用的比较两个数大小关系的方法就是作差,比较其结果与0的大小关系,为保证精度和准确性,我们用如下代码来控制要不要继续分:

             abs(guess ** 2 - x) > 0.0001

我们在取x==100对程序进行验证,结果如下:

根据以上结果对于大于1的数用二分法求解平方根的代码已经实现了。在这里感谢中国mooc网哈尔滨工业大学车万翔老师的授课。
但对于一个在0到1之间的数,我们知道0到1之间的任何一个数平方后的结果都小于原值(0,1除外),因此如果要沿用上面的程序达不到“逼近”的作用,反而扩大了,因此我对程序①②步作了以下改动:

                 if x > 0 and x < 1:high = 1.0low = 0guess = (low + high) / 2

这样,我们第一次取guess = 0.5,如果0.5² > x,我们下一次就在00.5之间取,反之在0.51之间取,直到取到符合循环停止条件的结果。举例验证:

到此为止已经解决了所有非负数平方根的求解,当然对于0和1:

              if x == 1.0 and x == 0.0:guess = x

现在要考虑负数的情况,思路是:

 ①取一个负数记为x_org;②将 (-x_org)赋给x;③x为正,带入前面的运算计算;④输出结果后面加个字符“j”,程序结束。

相关代码如下:

                     if x_org < 0:x = - x_orgelse:x = x_org
         elif x_org == -1.0:print("所求数的平方根为:guess = j" )else:print("所求数的平方根为:guess = %.1fj" % (guess))

程序验证:

基于此,用Python编写的二分法求平方根的问题已经完全解决了。这也是我编写的第二个基础的程序,还是蛮有收获,增添了我学习python的兴趣。希望这种兴趣能够只增不减。

重点来了:话不多说,直接上代码

 #!/usr/bin/python3# 利用二分法求解平方根x_org = float(input("请输入一个需要开方的数,且保留2位小数:\n x = "))# 判定x_org的正负,负数取反if x_org < 0:x = - x_orgelse:x = x_org# 变量的初始化## 程序第①步low = 0.0 high = x## 程序第②步guess = (low + high) / 2if x > 0 and x < 1:high = 1.0low = 0guess = (low + high) / 2# 二分法求解平方根if x >= 0:while abs(guess ** 2 - x) > 0.0001:if x > 1.0:# 大于1 的数if guess ** 2 < x:low = guess # 如果guess² < x,则low = guess,else:high = guess # 如果guess² > x,则high = guess,guess = (low + high) / 2 # 继续执行if x == 1.0 and x == 0.0:# 0 和1 的求解guess = xelse:if guess ** 2 < x: # 在0-1之间的数low = guesselse:high = guessguess = (low + high) / 2# 结果输出if x_org >= 0:## 非负数输出print("所求数的平方根为:guess = %.1f"%(guess))## 负数输出elif x_org == -1.0:print("所求数的平方根为:guess = j" )else:print("所求数的平方根为:guess = %.3fj" % (guess))

总结

对于0~1之间小数平方根的求解我还有另外一种思路,只是我尝试了一下不知为何陷入死循环,我把这种思路简单说一下:
对于一个0~1之间的小数,我可以人为输入它的小数位数,比如0.09的小数位数是2,我们就将这个数扩大100倍,变成9,成为一个大于1的数,再利用二分法求平方根,得到结果为3,再将3缩小√100倍,得到0.3,进而得到结果。相关程序代码如下:

     if x > 0 and x < 1:n = int(input("请输入被开方的小数位数:\n n = "))count = 10**nx = x * counthigh = xguess = (low + high) / 2count_high = countcount_low = 0count_guess = (count_low + count_high) / 2while abs(count_guess ** 2 - count) > 0.0001:if count_guess ** 2 < count:count_low = count_guesselse:count_high = count_guesscount_guess = (count_low + count_high) / 2
         if guess ** 2 < x:low = guesselse:high = guessguess = (low + high) / (2*count_guess)

谢谢大家阅读,如果你觉得有用,麻烦点个赞哟!

基于Python的二分法求平方根相关推荐

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

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

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

    对python这个高级语言感兴趣的小伙伴,下面一起跟随编程之家 jb51.cc的小编两巴掌来看看吧! 使用二分法(Bisection Method)求平方根. # @param 使用二分法(Bisec ...

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

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

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

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

  5. c++二分法求平方根

    c++二分法求平方根 class Solution { public: /** * * @param x int整型 * @return int整型 */ int sqrt(int x) { // w ...

  6. 用Python解“二分法求多项式单根 ”题

    7-18 二分法求多项式单根 二分法求函数根的原理为:如果连续函数f(x)在区间[a,b]的两个端点取值异号,即f(a)f(b)<0,则它在这个区间内至少存在1个根r,即f®=0. 二分法的步骤 ...

  7. python牛顿迭代法求平方根_牛顿迭代法计算平方根(Java,Python实现)

    牛顿法的作用是使用迭代的方法来求解函数方程的根.简单地说,牛顿法就是不断求取切线的过程.更多见:iii.run 数学推导 假设c为原数,t为c的根数. $$ t^2 \quad = \quad c$$ ...

  8. python牛顿迭代法求平方根_Newton迭代法求平方根

    牛顿迭代法求根 (即曲线与x坐标轴交点) : 在曲线的一点P1(a, f(a)), 做切线, 切线与x轴, 相交于 A 点, A点做垂线 与曲线交于 P2(b, f(b)) 点, 在P2点继续做切线, ...

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

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

  10. python牛顿迭代法求平方根_牛顿迭代法计算平方根

    public static double sqrt(doublex) {if(x<0)return Double.NaN;//not a number double err=1e-15;doub ...

最新文章

  1. 第一个Mybatis程序示例 Mybatis简介(一)
  2. 技术干货 | 轻松两步完成向 mPaaS 小程序传递启动参数
  3. AWS EC2怎么动态增加磁盘空间
  4. GUID和INT两种数据类型做主键的比较
  5. VUE中使用lib-flexible和 px2rem-loader
  6. 20165320 第六周学习总结
  7. Windows服务器放多个网站,测试无数次终于成功了,Windows服务器同时安装多个版本的MySQL的方法!...
  8. 【OR】YALMIP 整数规划
  9. ipxspx协议linux,三大协议 TCPIP NETBIOS IPX (转)
  10. solus linux下载链接,Solus Linux下载_Solus 4.0 最新版_零度软件园
  11. 在淘宝里,他们总结的一些前端Tips
  12. unsigned char code 是什么
  13. Ubuntu 笔记本合上盖子时,不进入休眠
  14. android项目学习心得(全源导航)
  15. 我在用的翻译软件 - 微软翻译+网易有道词典+谷歌翻译
  16. python读取excel(读写处理xls或xlsx)
  17. 进程间的通信方式与区别
  18. 练习9-15:彩票中奖率分析(Python变成从入门到实践学习)
  19. (reply-code=406, reply-text=PRECONDITION_FAILED - unknown delivery tag 1, class-id=60, method-id=80)
  20. 最简理解空间三角形中线与边的交点

热门文章

  1. Xcode隐藏SDK C、C++、Objective-C符号
  2. 复杂网络作业四:第三题——随机图、小世界网络和真实网络的度分布
  3. linux进入bios设置超线程,从BIOS开启超线程的方法
  4. 树莓派查看CPU温度
  5. 肖博高中高考数学答题技巧方法及常见问题
  6. 单片机学习笔记(数码管)
  7. 熊出没机器人光头强_《熊出没》里的温馨时刻,原来光头强和熊大熊二的关系也能这么好...
  8. VM12虚拟机安装xp系统教程
  9. 动态爱心表白代码(绝对炫酷)
  10. android 键盘修改回车键监听及无效处理,imeOptions无效处理