C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++の有理数表現から10進数を表示するプログラム


(分子/分母)の形式で有理数を表す分子と分母と呼ばれる2つの数があるとします。その10進表現を文字列として見つける必要があります。循環小数がある場合は、それらを括弧で囲みます。

したがって、入力が分子=164分母=3のような場合、出力は「54.(6)」になります。

これを解決するには、次の手順に従います-

  • 分子が0と同じ場合、-
    • 「0」を返す
  • 配列を定義します
  • 分子<0で分母>0または分子>0で分母<0の場合、-
    • ansの最後に「-」を挿入
  • 除数:=|分子|
  • 配当:=|分母|
  • 剰余:=除数mod配当
  • x:=(除数/被除数)を文字列に変換
  • iを初期化する場合:=0、i
  • ansの最後にx[i]を挿入します
  • 余りが0と同じ場合、-
    • 文字列としてansを返す
  • 「。」を挿入しますansの終わりに
  • 1つのマップを定義するm
  • 余りが0に等しくない場合は、-
      を実行します。
    • 余りがmでない場合、-
      • 挿入(ansの最初の要素は'(')をansに連結します
      • ansの最後に')'を挿入します
      • ループから抜け出す
    • それ以外の場合-
      • m [remainder]:=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)

    1. C++での10進数から16進数への変換プログラム

      10進数を入力として指定すると、タスクは指定された10進数を16進数に変換することです。 コンピューターの16進数は16を底とし、10進数は10を底とし、0〜9の値で表されますが、16進数は0〜15から始まる数字で、10はA、11はB、12はC、 Dとして13、Eとして14、Fとして15。 10進数を16進数に変換するには、指定された手順に従います- まず、指定された数値を変換数値の基本値で除算します。例: 6789を16を底とする16進数に変換し、商を取得して格納する必要があるため、6789を16で除算します。余りが0〜9の場合はそのまま保存し、余りが10〜15の場合は、文字形式でA-

    2. C++での10進数から2進数への変換プログラム

      10進数を入力として指定すると、タスクは指定された10進数を2進数に変換することです。 コンピューターの10進数は10進数で表され、2進数は2進数の0と1の2つしかないため、2進数で表されますが、10進数は0〜9から始まる任意の数値にすることができます。 10進数を2進数に変換するには、次の手順に従います- まず、指定された数値を変換数値の基本値で除算します。例: 42を2を底とする2進数に変換し、商を取得して格納する必要があるため、42を2で除算します。余りが0の場合、ビットを0として格納します。それ以外の場合は1です。 取得した商を2進数の基数である2で除算し、ビットを格納し続けます