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

Go和Java算法詳析之分?jǐn)?shù)到小數(shù)

 更新時(shí)間:2022年08月11日 11:18:04   作者:黃丫丫  
這篇文章主要給大家介紹了關(guān)于Go和Java算法詳析之分?jǐn)?shù)到小數(shù)的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

分?jǐn)?shù)到小數(shù)

給定兩個(gè)整數(shù),分別表示分?jǐn)?shù)的分子 numerator 和分母 denominator,以 字符串形式返回小數(shù) 。

如果小數(shù)部分為循環(huán)小數(shù),則將循環(huán)的部分括在括號(hào)內(nèi)。

如果存在多個(gè)答案,只需返回 任意一個(gè) 。

對(duì)于所有給定的輸入,保證 答案字符串的長(zhǎng)度小于 104 。

  • 示例 1:

輸入:numerator = 1, denominator = 2

輸出:"0.5"

  • 示例 2:

輸入:numerator = 2, denominator = 1

輸出:"2"

  • 示例 3:

輸入:numerator = 4, denominator = 333

輸出:"0.(012)"  

提示:

-231 <= numerator, denominator <= 231 - 1

denominator != 0

方法一:模擬豎式計(jì)算(Java)

這是一道模擬豎式計(jì)算(除法)的題目。

首先可以明確,兩個(gè)數(shù)相除要么是「有限位小數(shù)」,要么是「無(wú)限循環(huán)小數(shù)」,而不可能是「無(wú)限不循環(huán)小數(shù)」。

將分?jǐn)?shù)轉(zhuǎn)成整數(shù)或小數(shù),做法是計(jì)算分子和分母相除的結(jié)果??赡艿慕Y(jié)果有三種:整數(shù)、有限小數(shù)、無(wú)限循環(huán)小數(shù)。

如果分子可以被分母整除,則結(jié)果是整數(shù),將分子除以分母的商以字符串的形式返回即可。

如果分子不能被分母整除,則結(jié)果是有限小數(shù)或無(wú)限循環(huán)小數(shù),需要通過(guò)模擬長(zhǎng)除法的方式計(jì)算結(jié)果。為了方便處理,首先根據(jù)分子和分母的正負(fù)決定結(jié)果的正負(fù)(注意此時(shí)分子和分母都不為 00),然后將分子和分母都轉(zhuǎn)成正數(shù),再計(jì)算長(zhǎng)除法。

一個(gè)顯然的條件是,如果本身兩數(shù)能夠整除,直接返回即可;

如果兩個(gè)數(shù)有一個(gè)為“負(fù)數(shù)”,則最終答案為“負(fù)數(shù)”,因此可以起始先判斷兩數(shù)相乘是否小于 00,如果是,先往答案頭部追加一個(gè)負(fù)號(hào) -;

兩者范圍為 int,但計(jì)算結(jié)果可以會(huì)超過(guò) int 范圍,考慮 numerator = -2^{31}和 denominator = -1的情況,其結(jié)果為 2^{31},超出 int 的范圍 [-2^{31}, 2^{31} - 1]。因此起始需要先使用 long 對(duì)兩個(gè)入?yún)㈩愋娃D(zhuǎn)換一下。

class Solution {
    public String fractionToDecimal(int numerator, int denominator) {
        // 轉(zhuǎn) long 計(jì)算,防止溢出
        long a = numerator, b = denominator;
        // 如果本身能夠整除,直接返回計(jì)算結(jié)果
        if (a % b == 0) return String.valueOf(a / b);
        StringBuilder sb = new StringBuilder();
        // 如果其一為負(fù)數(shù),先追加負(fù)號(hào)
        if (a * b < 0) sb.append('-');
        a = Math.abs(a); b = Math.abs(b);
        // 計(jì)算小數(shù)點(diǎn)前的部分,并將余數(shù)賦值給 a
        sb.append(String.valueOf(a / b) + ".");
        a %= b;
        Map<Long, Integer> map = new HashMap<>();
        while (a != 0) {
            // 記錄當(dāng)前余數(shù)所在答案的位置,并繼續(xù)模擬除法運(yùn)算
            map.put(a, sb.length());
            a *= 10;
            sb.append(a / b);
            a %= b;
            // 如果當(dāng)前余數(shù)之前出現(xiàn)過(guò),則將 [出現(xiàn)位置 到 當(dāng)前位置] 的部分摳出來(lái)(循環(huán)小數(shù)部分)
            if (map.containsKey(a)) {
                int u = map.get(a);
                return String.format("%s(%s)", sb.substring(0, u), sb.substring(u));
            }
        }
        return sb.toString();
    }
}

時(shí)間復(fù)雜度:O(M)

空間復(fù)雜度:O(M)

方法一:模擬豎式計(jì)算(Go)

具體的方法詳情已經(jīng)在上文中表述,詳情請(qǐng)看上文。

func fractionToDecimal(numerator, denominator int) string {
    if numerator%denominator == 0 {
        return strconv.Itoa(numerator / denominator)
    }

    s := []byte{}
    if numerator < 0 != (denominator < 0) {
        s = append(s, '-')
    }

    // 整數(shù)部分
    numerator = abs(numerator)
    denominator = abs(denominator)
    integerPart := numerator / denominator
    s = append(s, strconv.Itoa(integerPart)...)
    s = append(s, '.')

    // 小數(shù)部分
    indexMap := map[int]int{}
    remainder := numerator % denominator
    for remainder != 0 && indexMap[remainder] == 0 {
        indexMap[remainder] = len(s)
        remainder *= 10
        s = append(s, '0'+byte(remainder/denominator))
        remainder %= denominator
    }
    if remainder > 0 { // 有循環(huán)節(jié)
        insertIndex := indexMap[remainder]
        s = append(s[:insertIndex], append([]byte{'('}, s[insertIndex:]...)...)
        s = append(s, ')')
    }

    return string(s)
}

func abs(x int) int {
    if x < 0 {
        return -x
    }
    return x
}

時(shí)間復(fù)雜度:O(M)

空間復(fù)雜度:O(M)

總結(jié)

到此這篇關(guān)于Go和Java算法詳析之分?jǐn)?shù)到小數(shù)的文章就介紹到這了,更多相關(guān)Go Java分?jǐn)?shù)到小數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Golang通脈之?dāng)?shù)據(jù)類型詳情

    Golang通脈之?dāng)?shù)據(jù)類型詳情

    這篇文章主要介紹了Golang通脈之?dāng)?shù)據(jù)類型,在編程語(yǔ)言中標(biāo)識(shí)符就是定義的具有某種意義的詞,比如變量名、常量名、函數(shù)名等等,Go語(yǔ)言中標(biāo)識(shí)符允許由字母數(shù)字和_(下劃線)組成,并且只能以字母和_開(kāi)頭,更詳細(xì)內(nèi)容請(qǐng)看下面文章吧
    2021-10-10
  • Go語(yǔ)言HTTP請(qǐng)求流式寫(xiě)入body的示例代碼

    Go語(yǔ)言HTTP請(qǐng)求流式寫(xiě)入body的示例代碼

    這篇文章主要介紹了Go語(yǔ)言HTTP請(qǐng)求流式寫(xiě)入body,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06
  • go語(yǔ)言接口用法實(shí)例分析

    go語(yǔ)言接口用法實(shí)例分析

    這篇文章主要介紹了go語(yǔ)言接口用法,實(shí)例分析了Go語(yǔ)言接口的定義及使用技巧,需要的朋友可以參考下
    2015-03-03
  • Go語(yǔ)言實(shí)現(xiàn)socket實(shí)例

    Go語(yǔ)言實(shí)現(xiàn)socket實(shí)例

    這篇文章主要介紹了Go語(yǔ)言實(shí)現(xiàn)socket的方法,實(shí)例分析了socket客戶端與服務(wù)器端的實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下
    2015-02-02
  • golang如何利用原始套接字構(gòu)造UDP包詳解

    golang如何利用原始套接字構(gòu)造UDP包詳解

    這篇文章主要給大家介紹了關(guān)于golang如何利用原始套接字構(gòu)造UDP包的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用golang具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。
    2017-10-10
  • 關(guān)于golang利用channel和goroutine完成統(tǒng)計(jì)素?cái)?shù)的思路

    關(guān)于golang利用channel和goroutine完成統(tǒng)計(jì)素?cái)?shù)的思路

    這篇文章主要介紹了golang利用channel和goroutine完成統(tǒng)計(jì)素?cái)?shù)的思路詳解,通過(guò)思路圖分析及實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2021-08-08
  • mac下安裝golang框架iris的方法

    mac下安裝golang框架iris的方法

    這篇文章主要介紹了mac下安裝golang框架iris的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • Golang實(shí)現(xiàn)Java虛擬機(jī)之解析class文件詳解

    Golang實(shí)現(xiàn)Java虛擬機(jī)之解析class文件詳解

    這篇文章主要為大家詳細(xì)介紹了Golang實(shí)現(xiàn)Java虛擬機(jī)之解析class文件的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-01-01
  • Golang中的[]byte與16進(jìn)制(String)之間的轉(zhuǎn)換方式

    Golang中的[]byte與16進(jìn)制(String)之間的轉(zhuǎn)換方式

    這篇文章主要介紹了Golang中的[]byte與16進(jìn)制(String)之間的轉(zhuǎn)換方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Go到底能不能實(shí)現(xiàn)安全的雙檢鎖(推薦)

    Go到底能不能實(shí)現(xiàn)安全的雙檢鎖(推薦)

    這篇文章主要介紹了Go到底能不能實(shí)現(xiàn)安全的雙檢鎖,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-05-05

最新評(píng)論

湖南省| 文成县| 阿拉尔市| 荥阳市| 湟中县| 靖宇县| 德江县| 紫阳县| 靖江市| 和平县| 英德市| 高州市| 新丰县| 婺源县| 河北省| 通海县| 寿阳县| 同心县| 台中市| 庆阳市| 黄大仙区| 徐水县| 察雅县| 保康县| 花莲县| 玉树县| 康保县| 济宁市| 南昌市| 卓尼县| 河南省| 郁南县| 若羌县| 石狮市| 竹北市| 陕西省| 深圳市| 扶绥县| 灵宝市| 安丘市| 平利县|