leetcode 69. Sqrt(x)-扩展二分法,牛顿法开根号(保留精度)

题目描述:

Implement int sqrt(int x).

Compute and return the square root of x, where x is guaranteed to be a non-negative integer.

Since the return type is an integer, the decimal digits are truncated and only the integer part of the result is returned.

Example 1:

Input: 4
Output: 2

Example 2:

Input: 8
Output: 2
Explanation: The square root of 8 is 2.82842..., and since 
             the decimal part is truncated, 2 is returned.

思路:

1.整数x开根号后的结果肯定在0-x之间所以可以对0-x进行二分查找;

实现:

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

扩展题:

输入整数x,输出开根号的结果,保留精度0.00001。

方法一:二分法

用二分法逐步缩小范围,每次将mid的平方与目标值进行比较,看它们的差是否小于精度,若小于精度,则退出循环,返回mid的值,否则,用二分的方式缩小范围。

实现:

private double sqrt(double  n){
	double start=0.0;
	double end=n;
	double p=1e-2;//精度要求
	double mid=(start+end)/2.0;
	while(Math.abs(mid*mid-n)>p){//浮点数之差的绝对值和精度进行比较
		if(mid*mid<n){
			start=mid;
		}else if(mid*mid>n){
			end=mid;
		}else{
			return mid;
		}
		mid=(start+end)/2.0;
		
	}
	return mid;}

如果保留小数点后三位,则返回Math.round(mid*1000)/1000.0;

有精度要求时,直接将mid*mid的值与精度进行比较作为循环继续的条件。最后退出时,直接返回mid就是满足精度条件的数。如果要求保留小数点后多少位的话,则需要使用math,round()

方法二、牛顿法

实现:

//牛顿法
private double sqrt2(int n){
	double x=1.0;//设置初始值
	double p=1e-5;
	while(Math.abs(x*x-n)>p){
		x=(x+(n/x))/2.0;
	}
	return x;	
}

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值