C++での等しい有理数
2つの文字列があり、これらはそれぞれ正の有理数を表すSとTであると仮定します。これらが同じ数を表すか、現在を表すかを確認する必要があります。文字列は、有理数の繰り返し部分を示すために括弧を使用する場合があります。
有理数は、整数部分、非繰り返し部分、繰り返し部分の最大3つの部分を使用して表すことができることがわかっています。番号は、次の3つの方法のいずれかで表されます-
-
整数部分のみ(0、12、123など)
-
IntegerPart.NonRepeatingPart(0.5、1.0、2.12、2.001など)
-
IntegerPart.NonRepeatingPart(RepeatingPart>)(0.1(6)、0.9(9)、0.00(1212)など)
たとえば、0.1(6)、0.1666(6)、または0.166(66)はどちらも、1/6の正しい表現です。
したがって、入力がS ="0.(52)"およびT ="0.5(25)"の場合、出力はTrueになります。
これを解決するには、次の手順に従います-
-
関数f()を定義します。これにはSが必要です。
-
i:=S
の'('のインデックス -
iが長さの範囲内にある場合、-
-
base:=インデックス0からi-1までのSの部分文字列
-
rep:=インデックスi + 1から(Sの長さ--i-3)までのSの部分文字列
-
初期化j:=0の場合、j <20の場合、更新(jを1増やします)、実行-
-
base:=base + rep
-
-
ベースを実際の値として返す
-
-
Sを実際の値として返す
-
-
主な機能から次のことを行います-
-
f(S)がf(T)と同じ場合はtrueを返します
理解を深めるために、次の実装を見てみましょう-
例
#include <bits/stdc++.h> using namespace std;class Solution { public: bool isRationalEqual(string S, string T){ return f(S) == f(T); } double f(string S){ auto i = S.find("("); if (i != string::npos) { string base = S.substr(0, i); string rep = S.substr(i + 1, S.length() - i - 2); for (int j = 0; j < 20; ++j) base += rep; return stod(base); } return stod(S); } }; main(){ Solution ob; cout << (ob.isRationalEqual("0.(52)", "0.5(25)")); }
入力
"0.(52)", "0.5(25)"
出力
1
-
C++でのエマープ番号
エマープ numberは特殊なタイプの数であり、その数字を逆にすると別の素数が作成されます(この素数は元の素数とは異なります)。 エマープは素数の逆です。 エマープではないいくつかの素数は、回文素数と1桁の素数です。 いくつかのエマープ番号 13、17、37、733です。 n未満のすべてのエマープ数を出力するプログラム。 ここでは、番号nが与えられており、すべてのemirp番号を出力する必要があります。 n以下。 問題を理解するために例を見てみましょう 入力: n =40 出力: 13、17、31、37 ソリューションアプローチ 指定された数よりも小さいすべてのエマー
-
C++でのデュードニー番号
与えられた数の底の数理論で定義された数は、最初の自然数の桁の合計が2番目の数の桁の合計に等しくなるように、別の自然数の完全な3乗に等しい自然数です。 (ウィキペディア)。 番号はヘンリー・デュードニーによって発見されました 。その数式 は- ここでは、整数nが与えられます。私たちの仕事は、与えられた番号nが人物番号であるかどうかを確認することです。 問題を理解するために例を見てみましょう 入力: N =17592 出力: いいえ 説明: 与えられた番号はダドニー番号ではありません。 ソリューションアプローチ- 解決策は、デュードニー番号の基本的な定義にあります。