zoukankan      html  css  js  c++  java
  • Sqrt(x) -- leetcode

    题目描述:
    Implement int sqrt(int x).

    Compute and return the square root of x.

    如果输入的是正整数,并且,输出int类型的话,可以用二分查找的方法。
    对于一个非负数n,它的平方根不会大于(n/2+1)。因为:
    (n/2+1)2=n+1+n2/4>n。因此只需要在[0, n/2+1]的区间内二分查找。
    代码:

    class Solution {
    public:
        int mySqrt(int x) {
            long long low = 0;
            long long high = x / 2 +1;
            long long mid = 0, p = 0;
            while(low <= high){
                mid = (low + high)/2;
                p = mid * mid;
                if (p == x) return mid;
                if (p < x) low = mid+1;
                if (p > x) high = mid-1;
            }
            return high;
        }
    };

    牛顿法:解决 double 类型的 x。

    可以将求sqrt(x)转为函数:f(x)=x2n的求解。
    牛顿迭代
    首先取x0,若x0不是此次的解,以点(x0,f(x0))f(x)的切线,与x轴交于(x1,0)然后以此类推。以这样的方式得到的xi会无限趋近于f(x)=0的解。通过判断前后两个解xixi1是否无限接近,来判断xi是否为f(x)=0的解。
    求过点(xi,f(xi))的切线方程,切线的斜率为f(xi),根据直线方程的两点式,f(x)f(xi)=f(xi)(xxi),然后令切线的f(x)=0xi+1=xif(xi)/f(xi)=xi(x2in)(2xi)=(xi+n/xi)/2
    根据迭代公式:

    #include <iostream>
    using namespace std;
    double sqrt(double);
    int main() {
        double n;
        while (cin >> n) {
            double ans = sqrt(n);
            cout << ans << endl;
        }
    
        system("pause");
        return 0;
    }
    //判断两个doule类型的值是否相等
    bool isEqual(double a, double b) {
        if (abs(a - b) > 0.000001)
            return false;
        return true;
    }
    //牛顿迭代法求解
    double sqrt(double n) {
        double last = 0.0;//保存上一次的值
        double res = 1.0;//最近一次的值,初始化
        while (!isEqual(last, res)) {//不相等,继续搜索
            last = res;//保存上一次的值
            res = (res + n / res) / 2;//x_(i+1)=(x_i + n / x_i)/2
        }
        return res;
    }

    结果

  • 相关阅读:
    图片规范、注释规范、测试工具约定
    javaScript书写规范
    css书写规范
    html书写规范
    Web 前端开发规范文档
    用CSS开启硬件加速来提高网站性能
    02-其他选择器
    01-css的引入方式和常用选择器
    03-body标签中相关标签-2
    02-body标签中相关标签-1
  • 原文地址:https://www.cnblogs.com/xiaocai-ios/p/7779754.html
Copyright © 2011-2022 走看看