今天的这篇文章是我在刷算法题的时候遇到的,最简单的方法是直接调用java里面的Sqrt函数,不过有时候题目中会要求我们不能使用库函数,所以在这里我们自己定义Sqrt方法。

最常见的思路有两种,第一种是二分法,第二种是牛顿的微积分思想。没错,想当年大学时候学了很久很痛苦的微积分,被我第一次派上用场了。对于这两种方法我们一个一个看。

一、二分法

二分法的思想很简单,就是从0到N不断的去缩小范围来找一个一个满足精度的最佳值。我们举一个函数的例子:

这就是二分法的思想,求平方根也是,我们从0到value取出中间值,然后不断地比较,假设value=10,查找区间为(0,10),这时候取(0,10)的中间值mid=5,mid*mid再和value比较之后,确定下一次查找的区间变为(0,5),依此类推。一直到满足我们需要的精度即可。下面我们使用java代码实现一下:

在这里value就是我们要求的数字,t表示的是精度。这个方法在这,大家可以测试一遍。不过在这里有一个小小的问题需要我们去注意:

如果我们对整数9取平方根,结果不是3,这里有精度损失,损失的原因之一是和计算机有关的,因为计算机的底层其实只有0和1,所以会无限的接近,而不能精确表示。

以上就是二分法求解的思想,这个思想很简单,不过实现的方法却是有一点点麻烦。在这里我们开始介绍第二种方法,那就是牛顿的微积分思想

二、牛顿迭代法

牛顿的微积分的思想就是无限接近,在这里提一句,如果你是数学大佬就不要追究思想到底是啥了。对于求平方根来说,使用切线来无限逼近的方式有时候能起到意想不到的效果。

设r是f(x) = 0的根,选取x0作为r初始近似值,过点(x0,f(x0))做曲线y = f(x)的切线L,L的方程为y = f(x0)+f'(x0)(x-x0),求出L与x轴交点的横坐标 x1 = x0-f(x0)/f'(x0),称x1为r的一次近似值。过点(x1,f(x1))做曲线y = f(x)的切线,并求该切线与x轴交点的横坐标 x2 = x1-f(x1)/f'(x1),称x2为r的二次近似值。重复以上过程,得r的近似值序列,其中x(n+1)=x(n)-f(x(n))/f'(x(n)),称为r的n+1次近似值,上式称为牛顿迭代公式。

我们使用一张图来演示一下:

这种方式也很好理解。所以我们直接来看实现

上面的方法同样可以表示。而且我们可以看到,牛顿的这个方法其实更加的简单。而且精度也更好。

c++调用求平方根函数_如何使用java语言求一个正整数的平方根?(不使用库函数)...相关推荐

  1. php怎么求最小公倍数,C++_详解C语言求两个数的最大公约数及最小公倍数的方法,求两个正整数的最大公约数nbs - phpStudy...

    详解C语言求两个数的最大公约数及最小公倍数的方法 求两个正整数的最大公约数 思路:这是一个很基本的问题,最常见的就是两种方法,辗转相除法和辗转相减法.通式分别为 f(x, y) = f(y, x%y) ...

  2. java编程九九乘法表_如何用JAVA语言编写一个九九乘法表

    教一下学了JAVA語言的同学们撰写一个99玖玖乘决表 方法 进行设计构思:假如把99玖玖乘决报表中如"1*1=1"算式全部当作一个一字的笔画体得话,99玖玖乘决表可当作一个倾斜角二 ...

  3. python输入一个正整数n求下列算式的值_C语言编写程序:输入一个正整数x和一个正整数n,求下列算式的值。,C语言 编写一个程序,输入一个正整数,求出它是几位数。...

    导航:网站首页 > C语言编写程序:输入一个正整数x和一个正整数n,求下列算式的值.,C语言 编写一个程序,输入一个正整数,求出它是几位数. C语言编写程序:输入一个正整数x和一个正整数n,求下 ...

  4. java语言中如何表示素数,使用Java语言求素数的几个方法

    使用Java语言求素数的几个方法 今天找了一篇"面试50题"的文档,第一题是求fibonacci数列,使用递归很容易就实现了,没什么难度. 第二题是输出101~200之间的素数,没 ...

  5. 语言求余和乘除优先级_愉快地学Java语言:第二章基本程序设计 第2讲

    导读 本文适合Java入门,不太适合Java中高级软件工程师. 本文以<Java程序设计基础篇>第10版为蓝本,采用不断提出问题,然后解答问题的方式来讲述. 本篇文章只是这个系列中的一篇, ...

  6. c语言辗转相除法求最大公约数_趣味探究:妙法求“最大公因数”,比书上难一点,你敢挑战吗?(适合56年级)...

    [题记] 宝石虽落在泥土里,仍是宝石,砂粒虽被吹到天空中,还是砂粒.--莎士比亚不是有水的地方就有青蛙,但是青蛙叫的地方必定有水.--歌德 [配合教材]本探究配合"因数与倍数".通 ...

  7. c语言求三门课程的平均成绩,C语言求三个学生四门课每个学生的平均成绩和每门课的平均成绩,并存入cx.txt中...

    C语言求三个学生四门课每个学生的平均成绩和每门课的平均成绩,并存入cx.txt中 # 求平均成绩 ```c #includestdio.h #includestring.h void input(fl ...

  8. 编写lisp程序解一元二次方程_怎样用C语言编一个解一元二次方程的程序?

    展开全部 用三个变量,来接一元二次方程的三个参数, 然后62616964757a686964616fe78988e69d8331333365633839根据这三个参数计算△=b*b-4ac,再根据△判 ...

  9. c语言求13为质数的代码,C语言求质数.doc

    C语言求质数 试编写一个程序,找出2->N之间的所有质数.希望用尽可能快的方法实现.[问题分析]: 这个问题可以有两种解法:一种是用"筛子法",另一种是从2->N检查, ...

最新文章

  1. 一起谈.NET技术,asp.net控件开发基础(20)
  2. python爬虫接单经历_一个Python小白5个小时爬虫经历
  3. 视频需求超平常数 10 倍,却节省了 60% 的 IT 成本投入是一种什么样的体验?
  4. linux下查看mysql的版本
  5. install ADT plugin
  6. 长沙android工程师,长沙安卓工程师辅导
  7. 将Tomcat配置到你的mac电脑上,命令行启动tomcat
  8. gstreamer 1.8.3 编译记录
  9. php 去除空余字符,PHP 删除字符串末端的空白字符(或者其他字符)
  10. 评测|HPE Nimble AF全闪存系列,诠释真正的高端存储
  11. 华为设备VRRP多VLAN负载分担
  12. injected stylesheet 导致页面样式异常
  13. 地平线:面向规模化量产的智能驾驶系统和软件开发
  14. Unity相机跟随以及子弹发射笔记
  15. 白嫖 IObit 系列软件例如 IObit Uninstaller
  16. 关于Mysql使用时出现部分错误的总结
  17. 机房UPS主机及电池该如何搬迁
  18. Android输入法挤乱布局问题
  19. 机器学习之路——KNN+交叉验证
  20. 多云架构落地设计和实施方案

热门文章

  1. 程序员5年工作经验,因频繁跳槽被面试官压工资!
  2. C语言很难学?不不不,只需要这几步!
  3. 可视化大屏设计指南,附20份可直接套用的实用模板
  4. 飞鸽传书2011绿色版使用简介
  5. 【飞秋】使用C++语言创建Silverlight中的VisualState
  6. 百度声明:从未答应屏蔽三鹿负面
  7. C++ 中重载 + 操作符的正确方法
  8. matlab复杂噪声产生实验报告,matlab加入噪声 - 范文中心
  9. Adobe illustrator 排版后图形导出这样的Tiff/PNG - 连载 3
  10. 45万例患者基因检测显示:NGS很难检测出七分之一的致病变异