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

 更新时间:2023年07月14日 10:45:31   作者:tq02  
这篇文章主要介绍了Java练习题之实现平方根(sqrt)函数的相关资料,平方根是一个数学概念,表示一个数的正平方根,文中通过代码和图文介绍的非常详细,需要的朋友可以参考下

前言

可使用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的平方,

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

复杂度分析:

时间复杂度: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

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

复杂度分析:

时间复杂度: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 附近有一个根,那么用以下迭代式子:

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

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

代码示例:

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,因此需要做强制类型转换
    }
}

总结

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

到此这篇关于Java练习题之实现平方根(sqrt)函数的文章就介绍到这了,更多相关Java平方根sqrt函数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot日期格式转换之配置全局日期格式转换器的实例详解

    SpringBoot日期格式转换之配置全局日期格式转换器的实例详解

    这篇文章主要介绍了SpringBoot日期格式转换之配置全局日期格式转换器的实例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • springboot项目打包的可执行jar运行报错问题及解决

    springboot项目打包的可执行jar运行报错问题及解决

    本文介绍了SpringBoot项目打包成可执行jar文件后无法使用java-jar命令启动的问题及解决方法,主要是需要在pom.xml文件中添加spring-boot-maven-plugin插件,以便生成正确的MANIFEST.MF文件
    2026-04-04
  • Java实现给PDF文件增加背景图的操作指南

    Java实现给PDF文件增加背景图的操作指南

    本文介绍了如何在Java中生成PDF文件并为其添加背景图,通过两种不同的方式实现:一种使用了iText库,另一种使用了PdfBox库,这两种方法都可以实现将背景图片添加到PDF文件中,并且可以根据项目需求选择合适的方法,需要的朋友可以参考下
    2025-11-11
  • 搭建MyBatis开发环境及基本的CURD介绍

    搭建MyBatis开发环境及基本的CURD介绍

    这篇文章主要介绍了搭建MyBatis开发环境及基本的CURD,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • Java二维码登录流程实现代码(包含短地址生成,含部分代码)

    Java二维码登录流程实现代码(包含短地址生成,含部分代码)

    近年来,二维码的使用越来越风生水起,本篇文章主要介绍了Java二维码登录流程实现代码,其中包含短地址生成,有兴趣的可以了解一下。
    2016-12-12
  • 若依前后端打成一个JAR包部署的完整步骤

    若依前后端打成一个JAR包部署的完整步骤

    这篇文章主要介绍了如何将若依前后端分离项目打包成jar,不使用nginx转发,前端修改了路由模式和环境变量配置,后端增加了依赖、配置了Thymeleaf和访问路径,需要的朋友可以参考下
    2025-01-01
  • SpringBoot项目配置多数据源的两种方式详解

    SpringBoot项目配置多数据源的两种方式详解

    这篇文章主要为大家详细介绍了SpringBoot项目配置多数据源的两种方式,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2026-01-01
  • Java如何基于反射机制获取不同的类

    Java如何基于反射机制获取不同的类

    这篇文章主要介绍了Java如何基于反射机制获取不同的类,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • 如何解决Maven无法拉取SNAPSHOT依赖问题

    如何解决Maven无法拉取SNAPSHOT依赖问题

    在使用Maven管理项目时,可能会遇到无法拉取SNAPSHOT版本依赖的问题,这通常是因为Maven默认不支持直接拉取SNAPSHOT版本,遇到这样的问题,可以通过在项目的pom.xml文件中添加<repositories>标签,并配置启用SNAPSHOT的仓库地址来解决
    2024-10-10
  • 解析SpringBoot整合SpringDataRedis的过程

    解析SpringBoot整合SpringDataRedis的过程

    这篇文章主要介绍了SpringBoot整合SpringDataRedis的过程,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-06-06

最新评论