給定兩個整數,分別表示分數的分子 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...