zoukankan      html  css  js  c++  java
  • X的平方根的golang实现

    实现 int sqrt(int x) 函数。

    计算并返回 x 的平方根,其中 x 是非负整数。

    由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。

    输入: 4
    输出: 2
    输入: 8
    输出: 2
    说明: 8 的平方根是 2.82842...,由于返回类型是整数,小数部分将被舍去。

    首先遇到这种题目肯定要想到使用内置得api来解答:

    //使用api来求解
    func mySqrt(x int) int {
        f := float64(x)
        ff := math.Sqrt(f)
        return int(ff)
    }
    其次我们可以使用牛顿法求平方根:

    牛顿法:(以本题为例子)

    计算平方根,其实就是计算

    x^2 =n

    的解

    令f(x)=x2-n,相当于求解f(x)=0的解,如上图所示。

    首先取x0,如果x0不是解,做一个经过(x0,f(x0))这个点的切线,与x轴的交点为x1。

    同样的道理,如果x1不是解,做一个经过(x1,f(x1))这个点的切线,与x轴的交点为x2。

    以此类推。

    以这样的方式得到的xi会无限趋近于f(x)=0的解。

    判断xi是否是f(x)=0的解有两种方法:

    一是直接计算f(xi)的值判断是否为0,二是判断前后两个解xi和xi-1是否无限接近。

    经过(xi, f(xi))这个点的切线方程为f(x) = f(xi) + f’(xi)(x - xi),其中f'(x)为f(x)的导数,本题中为2x。令切线方程等于0,即可求出xi+1=xi - f(xi) / f'(xi)。

    继续化简,xi+1=xi - (xi2 - n) / (2xi) = xi - xi / 2 + n / (2xi) = xi / 2 + n / 2xi = (xi + n/xi) / 2。

    迭代公式就已经出来了

    x = (x + n/x) / 2

    那么代码:

    //使用牛顿法求平方根
    func mySqrt1(x int) int {
        res := x
        //牛顿法求平方根
        for res*res > x {
            res = (res + x/res) / 2
        }
        return res
    }
  • 相关阅读:
    设计模式~门面模式
    设计模式~享元模式
    设计模式~代理模式
    Java IO流:(六)节点流(文件流)之 FileWriter
    Java IO流:(五)节点流(文件流)之 FileReader
    Java IO流:(四)节点流(文件流)
    Java IO流:(三)IO流四大基类
    Java IO流:(二)IO流原理及流的分类
    Java IO流:(一)File 文件类
    每周总结
  • 原文地址:https://www.cnblogs.com/TimLiuDream/p/10067742.html
Copyright © 2011-2022 走看看