<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
給定兩個整數,分別表示分數的分子 numerator 和分母 denominator,以 字串形式返回小數 。
如果小數部分為迴圈小數,則將回圈的部分括在括號內。
如果存在多個答案,只需返回 任意一個 。
對於所有給定的輸入,保證 答案字串的長度小於 104 。
輸入:numerator = 1, denominator = 2
輸出:"0.5"
輸入:numerator = 2, denominator = 1
輸出:"2"
輸入:numerator = 4, denominator = 333
輸出:"0.(012)"
提示:
-231 <= numerator, denominator <= 231 - 1
denominator != 0
這是一道模擬豎式計算(除法)的題目。
首先可以明確,兩個數相除要麼是「有限位小數」,要麼是「無限迴圈小數」,而不可能是「無限不迴圈小數」。
將分數轉成整數或小數,做法是計算分子和分母相除的結果。可能的結果有三種:整數、有限小數、無限迴圈小數。
如果分子可以被分母整除,則結果是整數,將分子除以分母的商以字串的形式返回即可。
如果分子不能被分母整除,則結果是有限小數或無限迴圈小數,需要通過模擬長除法的方式計算結果。為了方便處理,首先根據分子和分母的正負決定結果的正負(注意此時分子和分母都不為 00),然後將分子和分母都轉成正數,再計算長除法。
一個顯然的條件是,如果本身兩數能夠整除,直接返回即可;
如果兩個數有一個為“負數”,則最終答案為“負數”,因此可以起始先判斷兩數相乘是否小於 00,如果是,先往答案頭部追加一個負號 -;
兩者範圍為 int,但計算結果可以會超過 int 範圍,考慮 numerator = -2^{31}和 denominator = -1的情況,其結果為 2^{31},超出 int 的範圍 [-2^{31}, 2^{31} - 1]。因此起始需要先使用 long 對兩個入參型別轉換一下。
class Solution { public String fractionToDecimal(int numerator, int denominator) { // 轉 long 計算,防止溢位 long a = numerator, b = denominator; // 如果本身能夠整除,直接返回計算結果 if (a % b == 0) return String.valueOf(a / b); StringBuilder sb = new StringBuilder(); // 如果其一為負數,先追加負號 if (a * b < 0) sb.append('-'); a = Math.abs(a); b = Math.abs(b); // 計算小數點前的部分,並將餘數賦值給 a sb.append(String.valueOf(a / b) + "."); a %= b; Map<Long, Integer> map = new HashMap<>(); while (a != 0) { // 記錄當前餘數所在答案的位置,並繼續模擬除法運算 map.put(a, sb.length()); a *= 10; sb.append(a / b); a %= b; // 如果當前餘數之前出現過,則將 [出現位置 到 當前位置] 的部分摳出來(迴圈小數部分) 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)
具體的方法詳情已經在上文中表述,詳情請看上文。
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, '-') } // 整數部分 numerator = abs(numerator) denominator = abs(denominator) integerPart := numerator / denominator s = append(s, strconv.Itoa(integerPart)...) s = append(s, '.') // 小數部分 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 { // 有迴圈節 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)
到此這篇關於Go和Java演演算法詳析之分數到小數的文章就介紹到這了,更多相關Go Java分數到小數內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45