166. 分數到小數
阿新 • • 發佈:2021-02-03
1.題目描述
給定兩個整數,分別表示分數的分子 numerator 和分母 denominator,以 字串形式返回小數 。
如果小數部分為迴圈小數,則將迴圈的部分括在括號內。
如果存在多個答案,只需返回 任意一個 。
對於所有給定的輸入,保證 答案字串的長度小於 104 。
示例 1:
示例 2:
示例 3:
示例 4:
示例 5:
2.思路
小數部分如果餘數重複出現兩次就表示該小數是迴圈小數。
- 轉換為long long防止溢位
- 處理正負號,一正一負取負號
- 分子分母全部轉換為正數
- 獲得小數點的下標,把’('插入小數點前面
- map用來記錄出現重複數的下標,然後將’('插入到重複數前面
- 出現迴圈餘數,我們直接在重複數字前面新增’(’,字串末尾新增’)’
3.程式碼
class Solution {
public:
string fractionToDecimal(int numerator, int denominator) {
if(numerator == 0){
return "0";
}
if(denominator == 0){
return "";
}
string res = "" ;
//轉換為long long防止溢位
long long nume = static_cast<long long>(numerator);
long long denom = static_cast<long long>(denominator);
//處理正負號,異號為負
if((nume > 0) ^ (denom > 0)){
res.push_back('-');
}
//轉化為正數
nume = llabs( nume);
denom = llabs(denom);
//整數部分
res.append(to_string(nume / denom));
//小數部分
nume %= denom; //獲得餘數
if(nume == 0){
return res; //餘數為0直接返回
}
res.push_back('.');
int index = res.size() - 1; // 小數點下標
unordered_map<int, int> record;//記錄餘數重複的下標,將“(”插入重複數的前面
while(nume && record.count(nume) == 0){
record[nume] = ++index;
nume *= 10;
res += to_string(nume / denom);
nume %= denom;
}
if(record.count(nume) == 1){
res.insert(record[nume], "(");
res.push_back(')');
}
return res;
}
};