C++ 中分數到迴圈小數的轉換


假設我們有兩個整數代表分數的分子和分母,我們需要找到分數的字串格式。如果小數部分是迴圈的,則將迴圈部分用括號括起來。例如,如果分子是 2,分母是 3,則輸出為“0.(6)”

為了解決這個問題,我們將遵循以下步驟:

  • 如果分子為 0,則返回 0

  • 定義一個數組 ans

  • 如果分子 < 0 且分母 > 0 或分子 = 0 且分母 < 0,則將負號 ‘-’ 插入 ans 陣列

  • 除數 := |分子|,被除數 := |分母|,餘數 := 除數 mod 被除數

  • x := 除數 / 被除數 的字串

  • 將 x 中的每個字元插入 ans 陣列

  • 如果餘數 = 0,則返回 ans 陣列作為字串。

  • 在 ans 中插入點 ‘.’

  • 定義一個對映 m

  • 當餘數不為 0 時

    • 如果餘數存在於 m 中,則

      • 在 ans 的 m[餘數] 索引處插入左括號

      • 在 ans 的末尾插入右括號

      • 中斷迴圈

    • 否則

      • m[餘數] := ans 的大小

      • 餘數 := 餘數 * 10

      • 將 (餘數 / 被除數) 作為字元插入 ans

      • 餘數 := 餘數 mod 被除數

  • 返回 ans 陣列作為字串。

讓我們看下面的實現來更好地理解:

示例

 線上演示

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   string fractionToDecimal(int numerator, int denominator) {
      if(numerator == 0)return "0";
      vector <char> ans;
      if(numerator < 0 && denominator > 0 || numerator > 0 && denominator < 0)ans.push_back('-');
      long divisor = labs(numerator);
      long dividend = labs(denominator);
      long remainder = divisor % dividend;
      string x = to_string(divisor/dividend);
      for(int i = 0; i < x.size(); i++){
         ans.push_back(x[i]);
      }
      if(remainder == 0){
         return string(ans.begin(), ans.end());
      }
      ans.push_back('.');
      map <int, int> m;
      while(remainder != 0){
         if(m.find(remainder)!=m.end()){
            ans.insert(ans.begin() + m[remainder], '(');
            ans.push_back(')');
            break;
         }else{
            m[remainder] = ans.size();
            remainder *= 10;
            ans.push_back((remainder / dividend) + '0');
            remainder %= dividend;
         }
      }
      return string(ans.begin(), ans.end());
   }
};
main(){
   Solution ob;
   cout << ((ob.fractionToDecimal(100,6)));
}

輸入

100
6

輸出

16.(6)

更新於:2020-04-30

918 次瀏覽

開啟您的 職業生涯

透過完成課程獲得認證

開始學習
廣告
© . All rights reserved.