C++程式:顯示有理數的十進位制表示


假設我們有兩個數字,分別稱為分子和分母,它們以(分子/分母)的形式表示一個有理數。我們必須找到它的十進位制表示形式(字串)。如果有一些重複的數字,則用括號將它們括起來。

因此,如果輸入為分子 = 164,分母 = 3,則輸出為“54.(6)”。

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

  • 如果分子等於0,則:
    • 返回“0”
  • 定義一個數組ans
  • 如果分子 < 0 且分母 > 0 或分子 > 0 且分母 < 0,則:
    • 在ans的末尾插入'-'
  • 除數 := |分子|
  • 被除數 := |分母|
  • 餘數 := 除數 mod 被除數
  • x := 將(除數 / 被除數)轉換為字串
  • 對於初始化 i := 0,當 i < x 的大小,更新 (i 增加 1),執行:
    • 在ans的末尾插入x[i]
  • 如果餘數等於0,則:
    • 返回ans作為字串
  • 在ans的末尾插入'.'
  • 定義一個對映m
  • 當餘數不等於0時,執行:
    • 如果餘數不在m中,則:
      • 將(ans的第一個元素連線 '(')插入ans
      • 在ans的末尾插入')'
      • 退出迴圈
    • 否則:
      • m[餘數] := ans的大小
      • 餘數 := 餘數 * 10
      • 在ans的末尾插入(餘數 / 被除數)連線'0'
      • 餘數 := 餘數 mod 被除數
  • 返回ans作為字串

示例

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

線上演示

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   string solve(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());
   }
};
string solve(int numerator, int denominator) {
   return (new Solution())->solve(numerator, denominator);
}
int main() {
   cout << solve(164, 3);
}

輸入

164, 3

輸出

54.(6)

更新於:2020年12月12日

瀏覽量:332

開啟你的職業生涯

透過完成課程獲得認證

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