前言
这也是一道来自leetcode的题目,要求我们在不使用各个语言内置sqrt()函数的情况下对一个数开平方根,最后的结果向下取整。刚开始我对这道题目只能说是毫无思路了,后来还是评论区大神给我指了一条明路。这道题本质上是一个数学题。
leetcode原题
这个链接是leetcode的原题:
leetcode.com/problems/sq…
这道题的Level是Easy,这其实是因为找到数学方法之后这道题的代码非常好写。
Newton's Method
这道题的解法就是这个部分的标题,Newton's Method。
牛顿法,也被称为牛顿-拉弗森方法。这个方法其实也被用于机器学习中对参数的优化,速度快过常用的梯度下降法,但是也有一些限制。
牛顿法可以用来求当时的值。
它的基本公式长这个样子:
当然,这是经过推导的公式,推导过程大家可以自行搜索。
我们的任务就是找出一个来使用这个公式。
根据题目,我们要做的是求解一个,作为的解,由此可得。
如果我们给两边同时平方,就可得,我们接下来再变换一下的位置就可得。
这时,我们的就是,我们要做的就是求得时的值。
首先我们要先求得。
根据我们上面的公式易得
随后将和带入我们上面的牛顿公式,就可得下列等式:
我们随后将右边的分式进行变换可得:
再对式子进行整理就可得最终公式:
最后一步就是将这个公式用代码写出来,可以使用迭代循环来写。由于我们每次求得r都是向下取整,所以我们的判断循环终止的条件就是当r*r = 0时。