Java练习题之实现平方根(sqrt)函数

2023-08-06 0 1,031

目录

前言

可使用java.lang.Math类的sqrt(double)方法平方根。Math是java.lang包中的类,而Double为对象中基本类型。但是如果不使用库函数呢?有什么办法实现平方根函数呢?

方法:二分查找牛顿迭代法、利用平方数的性质

利用平方数的性质

平方数的性质:n²=1+1+2+2+....+n-1+n-1+n。例如4²=1+1+2+2+3+3+4=16。

1+3为2的平方,1+3+5为3的平方,

Java练习题之实现平方根(sqrt)函数

也就是说每一次加一个奇数,再设置一个变量记录加了多少个奇数。 

复杂度分析:

时间复杂度:O(N),每次+2的循环,为(1/2)N的时间复杂度,去掉系数,为O(N)

空间复杂度: O(1),只使用了有限常数个变量;

int sqrt(int x) {
     if(x<=0) return 0;  //小于等于0 返回0
     int ans = 1; 
     int num = 1;
     int  i = 3;
     while(num+i<=x){
         num+=i;  
          ans ++; // 每加一个奇数,ans+1
          i += 2;
        }
        return ans;
    }

二分查找

如果求解一个数的平方根,这个结果肯定是在1到这个数的范围,因此我们可以使用二分查找的方法。例如求解x的平方根,思路:

  1. 初始范围:1 ~ x,使用left标记1,right标记x ,取left~right的中间值,为 middle;
  2. 当middle*middle <= x && (middle+1)*(middle+1) > x时,返回结果
  3. 当 middle*middle < x时,到右半部分继续寻找,范围改成 middle+1 ~ right
  4. 当middle*middle > x时,到左半部分继续寻找,范围改成 left ~ middle+1

注: 这种方法只能使用于整数的开跟

Java练习题之实现平方根(sqrt)函数

复杂度分析:

时间复杂度:O(logn),二分查找的复杂度,每次循环减少一半

空间复杂度;O(1),只使用了有限常数个变量;

代码实现: 

public int mySqrt(int x) {
    if (x <= 0) {
        return 0;
    }
    int left = 1, right = x;
    while (true) {
        int middle = (left + right) >> 1;
        if (middle <= x / middle && (middle+1) > x / (middle+1)) {
            return (int) middle;
        } else if (middle < x / middle) {
            left = middle + 1;
        } else {
            right = middle - 1;
        }
    }
}

牛顿迭代法

牛顿迭代法简介

         假设方程 F(x)=0  在 x 附近有一个根,那么用以下迭代式子:

Java练习题之实现平方根(sqrt)函数

 依次计算X1、X2、X3、...........那么序列将无限逼近方程的根。

  牛顿迭代法的原理很简单,其实是根据f(x)在x0附近的值和斜率,估计f(x)和x轴的交点,看下面的动态图:

Java练习题之实现平方根(sqrt)函数

Java练习题之实现平方根(sqrt)函数

代码示例:

public class Solution {
	public int sqrt (int x) {//牛顿迭代法
        if(x==0||x==1) return x;//题中告诉我们x的范围: 0 <= x < 2^31-1
		long X0 = x;//使用int进行加法运算可能溢出,所以采用long型
		long X1 = 0;//下一个迭代变量,为了方便理解,也可只使用X0
		while(X0 > x/X0 ) {    // X0^2>x循环
			X1=(X0+x/X0) >> 1;//由迭代公式得,采用右移1位操作代替除以2,运算更快
			X0=X1;//把下一个迭代变量赋给X0,统一操作,方便继续处理
		}
		return (int)X0;//返回值类型为int,因此需要做强制类型转换
    }
}

总结

牛顿迭代法不像二分查找法、平方数,需要唤醒一下各位哥哥姐姐们的高中数学知识,只有这样才能理解该公式。如果唤醒失败,推荐使用二分查找法,不要逞强哦。

资源下载此资源下载价格为1小猪币,终身VIP免费,请先
由于本站资源来源于互联网,以研究交流为目的,所有仅供大家参考、学习,不存在任何商业目的与商业用途,如资源存在BUG以及其他任何问题,请自行解决,本站不提供技术服务! 由于资源为虚拟可复制性,下载后不予退积分和退款,谢谢您的支持!如遇到失效或错误的下载链接请联系客服QQ:442469558

:本文采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可, 转载请附上原文出处链接。
1、本站提供的源码不保证资源的完整性以及安全性,不附带任何技术服务!
2、本站提供的模板、软件工具等其他资源,均不包含技术服务,请大家谅解!
3、本站提供的资源仅供下载者参考学习,请勿用于任何商业用途,请24小时内删除!
4、如需商用,请购买正版,由于未及时购买正版发生的侵权行为,与本站无关。
5、本站部分资源存放于百度网盘或其他网盘中,请提前注册好百度网盘账号,下载安装百度网盘客户端或其他网盘客户端进行下载;
6、本站部分资源文件是经压缩后的,请下载后安装解压软件,推荐使用WinRAR和7-Zip解压软件。
7、如果本站提供的资源侵犯到了您的权益,请邮件联系: 442469558@qq.com 进行处理!

猪小侠源码-最新源码下载平台 Java教程 Java练习题之实现平方根(sqrt)函数 http://www.20zxx.cn/806608/xuexijiaocheng/javajc.html

猪小侠源码,优质资源分享网

常见问题
  • 本站所有资源版权均属于原作者所有,均只能用于参考学习,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担
查看详情
  • 最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,建议提前注册好百度网盘账号,使用百度网盘客户端下载
查看详情

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务