leetcode69. x 的平方根

本博客介绍了如何利用牛顿迭代法解决LeetCode第69题,即求非负整数x的平方根。通过不断迭代逼近,找到满足条件的整数解。例如,输入4时输出2,输入8时输出2。文中还提供了扩展思路,可求解小数点后十位的平方根。
摘要由CSDN通过智能技术生成

题目描述

实现 int sqrt(int x) 函数。

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

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

示例 1:

输入: 4
输出: 2

示例 2:

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

:如只需要解本题,代码如下:

class Solution {
    int mySqrt(int x)
    {
        if(x==0||x==1)
            return x;
        double x0=x;
        double t=x;
        x0=x0/2+t/(2*x0);
        while(Math.abs(x0*x0-t)>0.1)
        {
            x0=x0/2+t/(2*x0);
        }
        return (int)x0;
    }
}

这里我做了一些扩展,返回小数点后十位的平方根,有需要请自改。

题解

在这里插入图片描述
牛顿迭代法中,首先给定一个初始值X0,然后,通过这个初始值作函数的切线,与y=0交于一点,横坐标为x1, 在通过点(x1,f(x1))作函数的切线,与y=0交于点(横坐标为x2),这样一直下去,得到xn(若把xn代入方程得到的值与函数实际的值小于某一个很小的阈值,则我们认为xn就是函数的解)

故要求解sqrt(x),即求解sqrt(t)(t=x), 即求函数 f(x)=x2−t=0的解,我们给初始解赋一个初始值x0, 那么我们在点(x0,f(x0))处对曲线作切线, 得到如下方程y−f(x0)=f(x0)′(x−x0),令y=0, 解得x=x0/2+t/(2x0), 则迭代的解x1=x0/2+t/(2x0),像这样依次迭代xn=xn−1/2+t/(2xn−1), 若f(xn)很接近于0(与0的差绝对值小于某个阈值),这迭代终止,xn即为函数的解。

static double mySqrt(int x)
    {
        if(x==0||x==1)
            return x;
        double x0=x;
        double t=x;
        x0=x0/2+t/(2*x0);
        while(Math.abs(x0*x0-t)>0.0000000001)
        {
            x0=x0/2+t/(2*x0);
        }

        DecimalFormat df = new DecimalFormat("#.###########");
        return Double.parseDouble(df.format(x0));
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值