• Sqrt(x)


    Implement int sqrt(int x).

    Compute and return the square root of x.

    思路:二分查找法解决这道题

    class Solution {
    public:
        int sqrt(int x) {
            if(x<=1)
                return x;
            int low=1;
            int high=x;
            while(low<=high)
            {
                int mid=low+(high-low)/2;
                if(mid==x/mid)
                    return mid;
                else if(mid<x/mid)
                    low=mid+1;
                else
                    high=mid-1;
            }
            return high;
        }
    };

     思路二:用牛顿求根法。首先,选择一个接近函数f(x)零点的x_0,计算相应的f(x_0)和切线斜率f'(x_0)(这里f'表示函数f的导数)。然后我们计算穿过点(x_0, f(x_0))并且斜率为f'(x_0)的直线和x轴的交点的x坐标,也就是求如下方程的解:

    f(x_0)= (x_0-x)cdot f'(x_0)

    我们将新求得的点的x坐标命名为x_1,通常x_1会比x_0更接近方程f(x)=0的解。因此我们现在可以利用x_1开始下一轮迭代。迭代公式可化简为如下所示:

    x_{n+1} = x_n - frac{f(x_n)}{f'(x_n)}

    已经证明,如果f'是连续的,并且待求的零点x是孤立的,那么在零点x周围存在一个区域,只要初始值x_0位于这个邻近区域内,那么牛顿法必定收敛。 并且,如果f'(x)不为0, 那么牛顿法将具有平方收敛的性能. 粗略的说,这意味着每迭代一次,牛顿法结果的有效数字将增加一倍。

    class Solution {
    public:
        int sqrt(int x) {
            if(x<=1)
                return x;
            double a=x;
            double b=0;
            while(abs(b-a)>1e-6)
            {
                b=a;
                a=(b+x/b)/2;
            }
            return (int)a;
        }
    };
  • 相关阅读:
    NOI2021游记-记最后一段日子
    7.20 ZROI-Day7模拟赛
    7.19 ZROI-Day6模拟赛
    7.18 ZROI-Day5模拟赛
    7.17 ZROI-Day4模拟赛
    7.16 ZROI-DAY3 模拟赛
    7.15 ZROI-DAY2 模拟赛
    7.13 ZROI-DAY1赛后总结
    7.9模拟赛赛后总结
    7.7模拟赛赛后总结
  • 原文地址:https://www.cnblogs.com/awy-blog/p/3750307.html
Copyright © 2020-2023  润新知