LeetCode 166 分數到小數

2021-09-19 01:21:55 字數 1421 閱讀 6559

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

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

示例 1:

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

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

輸入:numerator = 2, denominator = 3輸出:"0.(6)"
此題先判斷結果的符號是不是負的,用變數sig_neg記錄。然後將給的被除數和除數轉換成long型別的變數,並取絕對值,接下來我們的求解過程使用正數。被除數是numerat,除數是denominat。我們先算一下小數點前的部分,用numerat除以denominat得到商div,得到餘數rem。然後我們判斷如果餘數rem為0那麼我們直接返回結果。沒有返回說明有小數部分,將ans加上小數點「.」,然後開始計算小數部分。我們建立乙個雜湊map,用來記錄當前餘數rem和用此餘數計算出的小數點後某位將在ans中記錄的位置之間的對映。然後我們建立乙個變數point用來記錄當前小數點後該記錄在某位,初始值是ans.size();也就是小數點後的第一位。然後我們進入while迴圈,當rem不等於0時,說明還沒有除盡,進入迴圈,我們先判斷rem在雜湊map中是否已經出現過,如果沒有出現過那麼我們將rem和當前的point組成對映存入雜湊map,然後將point加1;如果rem在雜湊map中已經出現過了,說明如果再繼續算下去,就會在ans中,從雜湊map裡存的出現的那個地方開始迴圈了。所以我們取出雜湊map中rem對應的值,就是之前出現過的那個地方,我們在那個地方插入乙個左括號,然後在ans尾部加上乙個右括號並返回ans。如果並沒有返回,說明沒有出現迴圈,我們要用當前的rem算出乙個小數字並加到ans的後面。於是先將rem乘以10,然後將rem除以denominat得到的商作為乙個小數字存到ans後面,然後我們將rem置為rem除以denominat得到的餘數。當不能除盡時,會出現迴圈小數,所以在while迴圈裡就return了;如果能除盡,那麼while迴圈最終會退出,返回ans即可。注意在所有return時,都要加上正負號的判斷。

class solution 

else

rem *= 10;

ans = ans + to_string(rem / denominat);

rem %= denominat;

}return sig_neg? "-" + ans : ans;

}};

Leetcode 166 分數到小數

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

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...