最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java練習(xí)題之實(shí)現(xiàn)平方根(sqrt)函數(shù)

 更新時(shí)間:2023年07月14日 10:45:31   作者:tq02  
這篇文章主要介紹了Java練習(xí)題之實(shí)現(xiàn)平方根(sqrt)函數(shù)的相關(guān)資料,平方根是一個(gè)數(shù)學(xué)概念,表示一個(gè)數(shù)的正平方根,文中通過代碼和圖文介紹的非常詳細(xì),需要的朋友可以參考下

前言

可使用java.lang.Math類的sqrt(double)方法求平方根。Math是java.lang包中的類,而Double為對象中的基本類型。但是如果不使用庫函數(shù)呢?有什么辦法實(shí)現(xiàn)平方根函數(shù)呢?

方法:二分查找、牛頓迭代法、利用平方數(shù)的性質(zhì)

利用平方數(shù)的性質(zhì)

平方數(shù)的性質(zhì):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的平方,

也就是說每一次加一個(gè)奇數(shù),再設(shè)置一個(gè)變量記錄加了多少個(gè)奇數(shù)。 

復(fù)雜度分析:

時(shí)間復(fù)雜度:O(N),每次+2的循環(huán),為(1/2)N的時(shí)間復(fù)雜度,去掉系數(shù),為O(N)

空間復(fù)雜度: O(1),只使用了有限常數(shù)個(gè)變量;

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 ++; // 每加一個(gè)奇數(shù),ans+1
          i += 2;
        }
        return ans;
    }

二分查找

如果求解一個(gè)數(shù)的平方根,這個(gè)結(jié)果肯定是在1到這個(gè)數(shù)的范圍,因此我們可以使用二分查找的方法。例如求解x的平方根,思路:

  1. 初始范圍:1 ~ x,使用left標(biāo)記1,right標(biāo)記x ,取left~right的中間值,為 middle;
  2. 當(dāng)middle*middle <= x && (middle+1)*(middle+1) > x時(shí),返回結(jié)果
  3. 當(dāng) middle*middle < x時(shí),到右半部分繼續(xù)尋找,范圍改成 middle+1 ~ right
  4. 當(dāng)middle*middle > x時(shí),到左半部分繼續(xù)尋找,范圍改成 left ~ middle+1

注: 這種方法只能使用于整數(shù)的開跟

復(fù)雜度分析:

時(shí)間復(fù)雜度:O(logn),二分查找的復(fù)雜度,每次循環(huán)減少一半

空間復(fù)雜度;O(1),只使用了有限常數(shù)個(gè)變量;

代碼實(shí)現(xiàn): 

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;
        }
    }
}

牛頓迭代法

牛頓迭代法簡介

         假設(shè)方程 F(x)=0  在 x 附近有一個(gè)根,那么用以下迭代式子:

 依次計(jì)算X1、X2、X3、...........那么序列將無限逼近方程的根。

  牛頓迭代法的原理很簡單,其實(shí)是根據(jù)f(x)在x0附近的值和斜率,估計(jì)f(x)和x軸的交點(diǎn),看下面的動(dòng)態(tài)圖:

代碼示例:

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進(jìn)行加法運(yùn)算可能溢出,所以采用long型
		long X1 = 0;//下一個(gè)迭代變量,為了方便理解,也可只使用X0
		while(X0 > x/X0 ) {    // X0^2>x循環(huán)
			X1=(X0+x/X0) >> 1;//由迭代公式得,采用右移1位操作代替除以2,運(yùn)算更快
			X0=X1;//把下一個(gè)迭代變量賦給X0,統(tǒng)一操作,方便繼續(xù)處理
		}
		return (int)X0;//返回值類型為int,因此需要做強(qiáng)制類型轉(zhuǎn)換
    }
}

總結(jié)

牛頓迭代法不像二分查找法、平方數(shù),需要喚醒一下各位哥哥姐姐們的高中數(shù)學(xué)知識(shí),只有這樣才能理解該公式。如果喚醒失敗,推薦使用二分查找法,不要逞強(qiáng)哦。

到此這篇關(guān)于Java練習(xí)題之實(shí)現(xiàn)平方根(sqrt)函數(shù)的文章就介紹到這了,更多相關(guān)Java平方根sqrt函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • SpringBoot日期格式轉(zhuǎn)換之配置全局日期格式轉(zhuǎn)換器的實(shí)例詳解

    SpringBoot日期格式轉(zhuǎn)換之配置全局日期格式轉(zhuǎn)換器的實(shí)例詳解

    這篇文章主要介紹了SpringBoot日期格式轉(zhuǎn)換之配置全局日期格式轉(zhuǎn)換器的實(shí)例詳解,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • springboot項(xiàng)目打包的可執(zhí)行jar運(yùn)行報(bào)錯(cuò)問題及解決

    springboot項(xiàng)目打包的可執(zhí)行jar運(yùn)行報(bào)錯(cuò)問題及解決

    本文介紹了SpringBoot項(xiàng)目打包成可執(zhí)行jar文件后無法使用java-jar命令啟動(dòng)的問題及解決方法,主要是需要在pom.xml文件中添加spring-boot-maven-plugin插件,以便生成正確的MANIFEST.MF文件
    2026-04-04
  • Java實(shí)現(xiàn)給PDF文件增加背景圖的操作指南

    Java實(shí)現(xiàn)給PDF文件增加背景圖的操作指南

    本文介紹了如何在Java中生成PDF文件并為其添加背景圖,通過兩種不同的方式實(shí)現(xiàn):一種使用了iText庫,另一種使用了PdfBox庫,這兩種方法都可以實(shí)現(xiàn)將背景圖片添加到PDF文件中,并且可以根據(jù)項(xiàng)目需求選擇合適的方法,需要的朋友可以參考下
    2025-11-11
  • 搭建MyBatis開發(fā)環(huán)境及基本的CURD介紹

    搭建MyBatis開發(fā)環(huán)境及基本的CURD介紹

    這篇文章主要介紹了搭建MyBatis開發(fā)環(huán)境及基本的CURD,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • Java二維碼登錄流程實(shí)現(xiàn)代碼(包含短地址生成,含部分代碼)

    Java二維碼登錄流程實(shí)現(xiàn)代碼(包含短地址生成,含部分代碼)

    近年來,二維碼的使用越來越風(fēng)生水起,本篇文章主要介紹了Java二維碼登錄流程實(shí)現(xiàn)代碼,其中包含短地址生成,有興趣的可以了解一下。
    2016-12-12
  • 若依前后端打成一個(gè)JAR包部署的完整步驟

    若依前后端打成一個(gè)JAR包部署的完整步驟

    這篇文章主要介紹了如何將若依前后端分離項(xiàng)目打包成jar,不使用nginx轉(zhuǎn)發(fā),前端修改了路由模式和環(huán)境變量配置,后端增加了依賴、配置了Thymeleaf和訪問路徑,需要的朋友可以參考下
    2025-01-01
  • SpringBoot項(xiàng)目配置多數(shù)據(jù)源的兩種方式詳解

    SpringBoot項(xiàng)目配置多數(shù)據(jù)源的兩種方式詳解

    這篇文章主要為大家詳細(xì)介紹了SpringBoot項(xiàng)目配置多數(shù)據(jù)源的兩種方式,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2026-01-01
  • Java如何基于反射機(jī)制獲取不同的類

    Java如何基于反射機(jī)制獲取不同的類

    這篇文章主要介紹了Java如何基于反射機(jī)制獲取不同的類,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-08-08
  • 如何解決Maven無法拉取SNAPSHOT依賴問題

    如何解決Maven無法拉取SNAPSHOT依賴問題

    在使用Maven管理項(xiàng)目時(shí),可能會(huì)遇到無法拉取SNAPSHOT版本依賴的問題,這通常是因?yàn)镸aven默認(rèn)不支持直接拉取SNAPSHOT版本,遇到這樣的問題,可以通過在項(xiàng)目的pom.xml文件中添加<repositories>標(biāo)簽,并配置啟用SNAPSHOT的倉庫地址來解決
    2024-10-10
  • 解析SpringBoot整合SpringDataRedis的過程

    解析SpringBoot整合SpringDataRedis的過程

    這篇文章主要介紹了SpringBoot整合SpringDataRedis的過程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06

最新評論

鹿邑县| 彰化县| 津市市| 景泰县| 宜章县| 焉耆| 贞丰县| 彰化县| 马关县| 九江市| 沧州市| 余干县| 吉安县| 灵川县| 五寨县| 突泉县| 京山县| 汶上县| 文山县| 乐清市| 西畴县| 沧源| 许昌市| 高淳县| 铜鼓县| 凤翔县| 商城县| 盐城市| 万安县| 佳木斯市| 兴业县| 上思县| 永嘉县| 澎湖县| 珠海市| 禹州市| 正宁县| 喀喇沁旗| 永川市| 崇信县| 望奎县|