欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

分數(shù)到小數(shù)

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

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

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

對于所有給定的輸入,保證 答案字符串的長度小于 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

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

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

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

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

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

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

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

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

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

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

時間復雜度:O(M)

空間復雜度:O(M)

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

具體的方法詳情已經(jī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
}

時間復雜度:O(M)

空間復雜度:O(M)

總結(jié)

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

相關文章

  • 使用golang如何優(yōu)雅的關機或重啟操作示例

    使用golang如何優(yōu)雅的關機或重啟操作示例

    這篇文章主要為大家介紹了使用golang如何優(yōu)雅的關機或重啟操作示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2022-04-04
  • GoLang RabbitMQ TTL與死信隊列以及延遲隊列詳細講解

    GoLang RabbitMQ TTL與死信隊列以及延遲隊列詳細講解

    這篇文章主要介紹了GoLang RabbitMQ TTL與死信隊列以及延遲隊列,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧
    2022-12-12
  • Go語言如何實現(xiàn)TCP通信詳解

    Go語言如何實現(xiàn)TCP通信詳解

    go里面實現(xiàn)tcp沒有像之前寫的C++那些那么麻煩,在C++里面要先創(chuàng)建套接字,然后綁定ip地址,go里面直接就一個函數(shù)建立套接字,然后在進行通信就可以了,下面這篇文章主要給大家介紹了關于Go語言如何實現(xiàn)TCP通信的相關資料,需要的朋友可以參考下
    2023-01-01
  • Golang常見錯誤之值拷貝和for循環(huán)中的單一變量詳解

    Golang常見錯誤之值拷貝和for循環(huán)中的單一變量詳解

    這篇文章主要給大家介紹了關于Golang常見錯誤之值拷貝和for循環(huán)中單一變量的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2017-11-11
  • Go設計模式之代理模式圖文詳解

    Go設計模式之代理模式圖文詳解

    這篇文章將通過圖文講解給大家詳細的介紹一下Go代理模式,代理模式是一種結(jié)構型設計模式,代理控制著對于原對象的訪問, 并允許在將請求提交給對象前后進行一些處理,感興趣的同學跟著小編一起來看看吧
    2023-07-07
  • 詳解在Go語言單元測試中如何解決Redis存儲依賴問題

    詳解在Go語言單元測試中如何解決Redis存儲依賴問題

    在編寫單元測試時,除了?MySQL?這個外部存儲依賴,Redis?應該是另一個最為常見的外部存儲依賴了,本文就來講解下如何解決?Redis?外部依賴,文章通過代碼示例介紹的非常詳細,需要的朋友可以參考下
    2023-08-08
  • golang gorm 操作mysql及gorm基本用法

    golang gorm 操作mysql及gorm基本用法

    golang 官方的那個操作mysql的有點麻煩所以就使用了gorm,下面就gorm的使用做下簡單介紹,感興趣的朋友跟隨小編一起看看吧
    2018-11-11
  • 詳解Go語言如何進行Http調(diào)用

    詳解Go語言如何進行Http調(diào)用

    無論是微服務還是單體架構等,服務間都有相互通信的時候,而最直接的通信方法就是 HTTP 調(diào)用,本文將會介紹在 Go 語言里,如何進行 HTTP 調(diào)用,需要的可以參考一下
    2022-12-12
  • golang中protobuf的使用詳解

    golang中protobuf的使用詳解

    protobuf是Google公司提出的一種輕便高效的結(jié)構化數(shù)據(jù)存儲格式,常用于結(jié)構化數(shù)據(jù)的序列化,具有語言無關、平臺無關、可擴展性特性,常用于通訊協(xié)議、服務端數(shù)據(jù)交換場景,下面我們就來看看golang中protobuf的具體使用吧
    2023-10-10
  • 詳解golang consul-grpc 服務注冊與發(fā)現(xiàn)

    詳解golang consul-grpc 服務注冊與發(fā)現(xiàn)

    這篇文章主要介紹了詳解golang consul-grpc 服務注冊與發(fā)現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-06-06

最新評論