Leetcode 166 分數到小數

2021-09-01 12:04:47 字數 1793 閱讀 3208

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

如果小數部分為迴圈小數,則將迴圈的部分括在括號內。

示例 1:

輸入:numerator = 1, denominator = 2輸出:"0.5"
示例 2:

輸入:numerator = 2, denominator = 1輸出:"2"
示例 3:

輸入:numerator = 2, denominator = 3輸出:"0.(6)"
解題思路雜湊,字串流。本題是整數除法,需要注意:

1. 分子為0,return "0";

2. 分母為0,return "";

3. 分母為1,return 分子轉成字串。

4. 分母為-1, return (-分子)轉成字串。

5. 整數的範圍[-2^32,2^32-1]不對稱。

一般而言,我們可以用列豎式的方法得到小數部分。

1. 當分子n大於分母d時,將n/d轉換成字串加入結果res中,n=n%d;如此一來只有第一步計算會出現分子大於分母的情況。

2. 當分子小於分母時,後續加入恰當的0使得n恰好大於d,假設加入的0有nums個,先記錄當前分子n出現時res的規模,再次進行1步驟,只不過要向res中補充nums-1個0。

3. 當出現同樣的分子分母時,說明就遇到了迴圈小數,分母是不變的,所以我們只需要用hash表來儲存遇到過得分子即可。

4. 將迴圈的一段字串加入括號,並且盡量將括號往前移動。移動的條件是,右括號「)」前面的乙個字元等於左括號「(」前面的乙個字元。

最終輸出結果就是題目中需要的小數。注意第2部中,要找到乙個恰好大於d的數,這樣一來,如果用d=int32_max,那麼在32位的整形資料中將找不到結果,因此改用資料型別long long。

整數轉成字串:

int nums = 0;//補充的0的個數

while (long_n < long_d)

int remain = long_n % long_d;

ss << long_n / long_d;

ss >> str;

str = string(nums - 1, '0') + str;

res += str;

if (remain == 0)

else

}if (res[res.size() - 1] == '.') res.erase(res.size() - 1, 1);

return (sgn_n^sgn_d?"-":"")+res;}};

leetcode166 分數到小數

給定兩個整數,分別表示分數的分子 numerator 和分母 denominator,以字串形式返回小數。如果小數部分為迴圈小數,則將迴圈的部分括在括號內。示例 1 輸入 numerator 1,denominator 2 輸出 0.5 示例 2 輸入 numerator 2,denominator...

LeetCode 166 分數到小數

給定兩個整數,分別表示分數的分子 numerator 和分母 denominator,以字串形式返回小數。如果小數部分為迴圈小數,則將迴圈的部分括在括號內。示例 1 輸入 numerator 1,denominator 2輸出 0.5 示例 2 輸入 numerator 2,denominator ...

Leetcode 166 分數到小數

給定兩個整數,分別表示分數的分子 numerator 和分母 denominator,以字串形式返回小數。如果小數部分為迴圈小數,則將迴圈的部分括在括號內。示例 1 輸入 numerator 1,denominator 2 輸出 0.5 示例 2 輸入 numerator 2,denominator...