1. 程式人生 > 其它 >166. 分數到小數

166. 分數到小數

技術標籤:LeetCode陣列資料結構leetcode

1.題目描述

給定兩個整數,分別表示分數的分子 numerator 和分母 denominator,以 字串形式返回小數 。
如果小數部分為迴圈小數,則將迴圈的部分括在括號內。
如果存在多個答案,只需返回 任意一個 。
對於所有給定的輸入,保證 答案字串的長度小於 104 。
示例 1:
在這裡插入圖片描述
示例 2:
在這裡插入圖片描述
示例 3:
在這裡插入圖片描述
示例 4:
在這裡插入圖片描述
示例 5:
在這裡插入圖片描述

2.思路

小數部分如果餘數重複出現兩次就表示該小數是迴圈小數。

  1. 轉換為long long防止溢位
  2. 處理正負號,一正一負取負號
  3. 分子分母全部轉換為正數
  4. 獲得小數點的下標,把’('插入小數點前面
  5. map用來記錄出現重複數的下標,然後將’('插入到重複數前面
  6. 出現迴圈餘數,我們直接在重複數字前面新增’(’,字串末尾新增’)’

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; } };